<div dir="ltr">I've been having a few reboots due to aborts.  Any ideas on where I might look at for this one which is in the TCPIP stack:<div>//.</div><div>---8<------</div><div>0x4008ddae is in invoke_abort (/home/michaelg/esp/esp-idf/components/esp32/panic.c:156).<br>151     #endif<br>152         while (1) {<br>153             if (esp_cpu_in_ocd_debug_mode()) {<br>154                 __asm__ ("break 0,0");<br>155             }<br>156             *((int *) 0) = 0;<br>157         }<br>158     }<br>159<br>160     void abort()<br>0x4008e049 is in abort (/home/michaelg/esp/esp-idf/components/esp32/panic.c:171).<br>166          * don't overwrite that.<br>167          */<br>168         if (esp_reset_reason_get_hint() == ESP_RST_UNKNOWN) {<br>169             esp_reset_reason_set_hint(ESP_RST_PANIC);<br>170         }<br>171         invoke_abort();<br>172     }<br>173<br>174<br>175     static const char *edesc[] = {<br>0x400925ff is in multi_heap_assert (/home/michaelg/esp/esp-idf/components/heap/multi_heap_platform.h:54).<br>49      #ifndef NDEBUG<br>50          if(!condition) {<br>51      #ifndef CONFIG_OPTIMIZATION_ASSERTIONS_SILENT<br>52              ets_printf(format, line, address);<br>53      #endif  // CONFIG_OPTIMIZATION_ASSERTIONS_SILENT<br>54              abort();<br>55          }<br>56      #else // NDEBUG<br>57          (void) condition;<br>58      #endif // NDEBUG<br>0x40092629 is in get_prev_free_block (/home/michaelg/esp/esp-idf/components/heap/multi_heap.c:187).<br>182     static heap_block_t *get_prev_free_block(heap_t *heap, const heap_block_t *block)<br>183     {<br>184         assert(!is_first_block(heap, block)); /* can't look for a block before first_block */<br>185<br>186         for (heap_block_t *b = &heap->first_block; b != NULL && b < block; b = b->next_free) {<br>187             MULTI_HEAP_ASSERT(is_free(b), b); // Block should be free<br>188             if (b->next_free == NULL || b->next_free >= block) {<br>189                 if (is_free(block)) {<br>190                      /* if block is on freelist, 'b' should be the item before it. */<br>191                     MULTI_HEAP_ASSERT(b->next_free == block, &b->next_free);<br>0x40092a9a is in multi_heap_free_impl (/home/michaelg/esp/esp-idf/components/heap/multi_heap.c:484).<br>479         MULTI_HEAP_ASSERT(!is_first_block(heap, pb), pb); // block should not be first block<br>480<br>481         heap_block_t *next = get_next_block(pb);<br>482<br>483         /* Update freelist pointers */<br>484         heap_block_t *prev_free = get_prev_free_block(heap, pb);<br>485         // freelist validity check<br>486         MULTI_HEAP_ASSERT(prev_free->next_free == NULL || prev_free->next_free > pb, &prev_free->next_free);<br>487         pb->next_free = prev_free->next_free;<br>488         prev_free->next_free = pb;<br>0x4009302e is in multi_heap_free (/home/michaelg/esp/esp-idf/components/heap/multi_heap_poisoning.c:225).<br>220         #ifdef SLOW<br>221         /* replace everything with FREE_FILL_PATTERN, including the poison head/tail */<br>222         memset(head, FREE_FILL_PATTERN,<br>223                head->alloc_size + POISON_OVERHEAD);<br>224         #endif<br>225         multi_heap_free_impl(heap, head);<br>226<br>227         multi_heap_internal_unlock(heap);<br>228     }<br>229<br>0x4008449d is in heap_caps_free (/home/michaelg/esp/esp-idf/components/heap/heap_caps.c:268).<br>263             ptr = (void *)dramAddrPtr[-1];<br>264         }<br>265<br>266         heap_t *heap = find_containing_heap(ptr);<br>267         assert(heap != NULL && "free() target pointer is outside heap areas");<br>268         multi_heap_free(heap->heap, ptr);<br>269     }<br>270<br>271     IRAM_ATTR void *heap_caps_realloc( void *ptr, size_t size, int caps)<br>272     {<br>0x40084a91 is in _free_r (/home/michaelg/esp/esp-idf/components/newlib/syscalls.c:42).<br>37          return heap_caps_malloc_default( size );<br>38      }<br>39<br>40      void IRAM_ATTR _free_r(struct _reent *r, void* ptr)<br>41      {<br>42          heap_caps_free( ptr );<br>43      }<br>44<br>45      void* IRAM_ATTR _realloc_r(struct _reent *r, void* ptr, size_t size)<br>46      {<br>0x40118a48 is in mem_free (/home/michaelg/esp/esp-idf/components/lwip/lwip/src/core/mem.c:176).<br>171       LWIP_ASSERT("rmem == MEM_ALIGN(rmem)", (rmem == LWIP_MEM_ALIGN(rmem)));<br>172     #if LWIP_STATS && MEM_STATS<br>173       rmem = (u8_t*)rmem - MEM_LIBC_STATSHELPER_SIZE;<br>174       MEM_STATS_DEC_USED(used, *(mem_size_t*)rmem);<br>175     #endif<br>176       mem_clib_free(rmem);<br>177     }<br>178<br>179     #elif MEM_USE_POOLS<br>180<br>0x40118a9f is in do_memp_free_pool (/home/michaelg/esp/esp-idf/components/lwip/lwip/src/core/memp.c:432).<br>427     #endif<br>428<br>429     #if MEMP_MEM_MALLOC<br>430       LWIP_UNUSED_ARG(desc);<br>431       SYS_ARCH_UNPROTECT(old_level);<br>432       mem_free(memp);<br>433     #else /* MEMP_MEM_MALLOC */<br>434       memp->next = *desc->tab;<br>435       *desc->tab = memp;<br>436<br>0x40118b17 is in memp_free (/home/michaelg/esp/esp-idf/components/lwip/lwip/src/core/memp.c:489).<br>484<br>485     #ifdef LWIP_HOOK_MEMP_AVAILABLE<br>486       old_first = *memp_pools[type]->tab;<br>487     #endif<br>488<br>489       do_memp_free_pool(memp_pools[type], mem);<br>490<br>491     #ifdef LWIP_HOOK_MEMP_AVAILABLE<br>492       if (old_first == NULL) {<br>493         LWIP_HOOK_MEMP_AVAILABLE(type);<br>0x4011e911 is in sys_timeouts_mbox_fetch (/home/michaelg/esp/esp-idf/components/lwip/lwip/src/core/timeouts.c:354).<br>349             if (handler != NULL) {<br>350               LWIP_DEBUGF(TIMERS_DEBUG, ("sct calling h=%s arg=%p\n",<br>351                 tmptimeout->handler_name, arg));<br>352             }<br>353     #endif /* LWIP_DEBUG_TIMERNAMES */<br>354             memp_free(MEMP_SYS_TIMEOUT, tmptimeout);<br>355             if (handler != NULL) {<br>356     #if !NO_SYS<br>357               /* For LWIP_TCPIP_CORE_LOCKING, lock the core before calling the<br>358                  timeout handler function. */<br>0x401186f8 is in tcpip_thread (/home/michaelg/esp/esp-idf/components/lwip/lwip/src/api/tcpip.c:109).<br>104       LOCK_TCPIP_CORE();<br>105       while (1) {                          /* MAIN Loop */<br>106         UNLOCK_TCPIP_CORE();<br>107         LWIP_TCPIP_THREAD_ALIVE();<br>108         /* wait for a message, timeouts are processed while waiting */<br>109         TCPIP_MBOX_FETCH(&mbox, (void **)&msg);<br>110         LOCK_TCPIP_CORE();<br>111         if (msg == NULL) {<br>112           LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: invalid message: NULL\n"));<br>113           LWIP_ASSERT("tcpip_thread: invalid message", 0);</div></div>