以下错误在esp32中意味着什么?

What does following error means in esp32?

我正在研究 esp32 MQTT。当我从云向微控制器发布一条消息时,我收到了一条基于 msg 程序的 MQTT 消息,在该过程完成后进行处理,我正在使用 MQTT 发送确认。发送确认后,esp 崩溃了。所以,我想知道这个错误是什么意思? 我收到错误的可能原因是什么?

DEBUG: [mqtt.c:800:handleMqttPayload]  ------------------------>line  
DEBUG: [mqtt.c:472:_mqttSubscriptionCallback]  ------------------------>line  
Guru Meditation Error: Core  0 panic'ed (LoadProhibited). Exception was unhandled.
Core 0 register dump:
PC      : 0x400957b6  PS      : 0x00060933  A0      : 0x80085160  A1      : 0x3ffe2120  
0x400957b6: is_free at /home/horsemann/Desktop/WorkSpace/TestingRepo/vendors/espressif/esp-idf/components/heap/multi_heap.c:380
 (inlined by) multi_heap_malloc_impl at /home/horsemann/Desktop/WorkSpace/TestingRepo/vendors/espressif/esp-idf/components/heap/multi_heap.c:432

A2      : 0x3ffb9a20  A3      : 0x00000074  A4      : 0x3ffb9bc2  A5      : 0x3ffc24f4  
A6      : 0x00000000  A7      : 0x3ffc1930  A8      : 0x62df42e6  A9      : 0x00003ffb  
A10     : 0x00000001  A11     : 0x00000001  A12     : 0x62df42e6  A13     : 0x3ffb9b98  
A14     : 0x3ffb9bc2  A15     : 0x00000003  SAR     : 0x0000001d  EXCCAUSE: 0x0000001c  
EXCVADDR: 0x00003ffb  LBEG    : 0x4000c2e0  LEND    : 0x4000c2f6  LCOUNT  : 0xffffffff  

ELF file SHA256: 6ba6c7666cfc3a6affb97ff2c01bc138e861781ba07bfe6d7e01fbf2e790ec91

Backtrace: 0x400957b6:0x3ffe2120 0x4008515d:0x3ffe2140 0x40085456:0x3ffe2160 0x40085671:0x3ffe21a0 0x400817ad:0x3ffe21c0 0x400eeae1:0x3ffe21e0 0x400ef431:0x3ffe2220 0x400ee77f:0x3ffe2240 0x400e2ca4:0x3ffe2270 0x400e2e90:0x3ffe22c0 0x400f2ca9:0x3ffe22e0 0x400f2d18:0x3ffe2300 0x400f3c7a:0x3ffe2320 0x4008fa5d:0x3ffe2350
0x400957b6: is_free at /home/horsemann/Desktop/WorkSpace/TestingRepo/vendors/espressif/esp-idf/components/heap/multi_heap.c:380
 (inlined by) multi_heap_malloc_impl at /home/horsemann/Desktop/WorkSpace/TestingRepo/vendors/espressif/esp-idf/components/heap/multi_heap.c:432

0x4008515d: heap_caps_malloc at /home/horsemann/Desktop/WorkSpace/TestingRepo/vendors/espressif/esp-idf/components/heap/heap_caps.c:232

0x40085456: trace_malloc at /home/horsemann/Desktop/WorkSpace/TestingRepo/vendors/espressif/esp-idf/components/heap/heap_trace.c:188

0x40085671: __wrap_heap_caps_malloc at /home/horsemann/Desktop/WorkSpace/TestingRepo/vendors/espressif/esp-idf/components/heap/heap_trace.c:421

0x400817ad: malloc_internal_wrapper at /home/horsemann/Desktop/WorkSpace/TestingRepo/vendors/espressif/esp-idf/components/esp32/esp_adapter.c:407

0x400eeae1: esf_buf_alloc at ??:?

0x400ef431: ic_ebuf_alloc at ??:?

0x400ee77f: ieee80211_getmgtframe at ??:?

0x400e2ca4: ieee80211_encap_null_data at ??:?

0x400e2e90: ieee80211_pm_tx_null_process at ??:?

0x400f2ca9: pm_tx_null_data_done_process at ??:?

0x400f2d18: pm_send_wake_null_cb at ??:?

0x400f3c7a: ppProcTxDone at ??:?

0x4008fa5d: ppTask at ??:?

调用堆栈显示在调试输出中:

ppTask calls
ppProcTxDone calls
pm_send_wake_null_cb etc.

由于错误很可能出现在您的代码中,您应该在调用堆栈转储中的下一个函数的地方查看您的回溯中的最后一次调用,并验证有效性任何调用参数。

此处的另一个有用信息是 EXCCAUSE(异常原因)寄存器 28(0x1C) 中的值: 指示访问无效地址。

异常的位置是:

0x400957b6: is_free at [...]/espressif/esp-idf/components/heap/multi_heap.c:380

That function 看起来像这样:

static inline bool is_free(const block_header_t *block)
{
    return ((block->size & 0x01) != 0);
}

最可能的异常原因是 block 引用无效位置或为空或在被 block->size 取消引用时具有无效对齐。例外情况更像是这些可能性中的第一种(或第二种)。

这表明堆损坏,这可能在之前的任何时间发生在任何地方 - 不一定在回溯指示的代码路径中。它通常是由过度运行 或不足运行 分配的堆块引起的,然后在新的堆操作(mallocfreenew 时检测到, delete 等)并尝试解释已经损坏的堆。

因此,您需要检查每个动态分配块的使用情况,以确保您拥有例如:

  • 在所有情况下都分配了适当的大小,
  • 没有访问和修改超出分配大小范围的数据,
  • free'd / delete' 或以其他方式返回到堆后未访问内存。
  • 没有内存泄漏。

旁白: “Guru Mediation Error”是"Guru Meditation Error"的拼写错误;它本身是没有意义的(一个“可爱的”计算历史引用本身就是一个笑话,然后由于拼写错误而变得不那么可爱或有趣),但它本质上类似于 内核恐慌蓝屏。关键是;出现异常。