我一直在使用 ESP RTOS SDK,但最近改用 Arduino SDK。RTOS SDK 最棒的地方之一就是它的崩溃日志记录。它有一个叫做 IDF Monitor 的东西,它是一个充当串行控制台的工具,但是当它发现设备崩溃时会有一些特殊的行为。原始崩溃日志如下所示:
代码:
全选Guru Medita
tion Error: Core 0 panic'ed (LoadProhibited). Exception was unhandled.
Core 0 register dump:
PC : 0x402234de PS : 0x00000033 A0 : 0x402234db A1 : 0x3ffef640
A2 : 0x00000001 A3 : 0x3ffea65c A4 : 0xffffffff A5 : 0x00000000
A6 : 0x3fff4838 A7 : 0x3fff4830 A8 : 0xbfff4880 A9 : 0x0000012c
A10 : 0x00000006 A11 : 0x00000002 A12 : 0x00000000 A13 : 0x00000000
A14 : 0x00000000 A15 : 0x3ffef680 SAR : 0x0000001f EXCCAUSE: 0x0000001c
Backtrace: 0x402234de:0x3ffef640 0x40225e88:0x3ffef680 0x40226389:0x3ffef6a0 0x4025e978:0x3ffef6c0 0x4025ef89:0x3ffef6e0 0x40260454:0x3ffef700 0x40260514:0x3ffef760 0x402600bb:0x3ffef770
但 IDF Monitor 对其进行了装饰,使其看起来像这样:
代码:
全选Guru Meditation Error: Core 0 panic'ed (LoadProhibited). Exception was unhandled.
Core 0 register dump:
PC : 0x402234de PS : 0x00000033 A0 : 0x402234db A1 : 0x3ffef640
0x402234de: xQueueGenericSend at /Users/cmarrin/esp/ESP8266_RTOS_SDK/components/freertos/freertos/queue.c:2332
0x402234db: xQueueGenericSend at /Users/cmarrin/esp/ESP8266_RTOS_SDK/components/freertos/freertos/queue.c:2332
A2 : 0x00000001 A3 : 0x3ffea65c A4 : 0xffffffff A5 : 0x00000000
A6 : 0x3fff4838 A7 : 0x3fff4830 A8 : 0xbfff4880 A9 : 0x0000012c
A10 : 0x00000006 A11 : 0x00000002 A12 : 0x00000000 A13 : 0x00000000
A14 : 0x00000000 A15 : 0x3ffef680 SAR : 0x0000001f EXCCAUSE: 0x0000001c
Backtrace: 0x402234de:0x3ffef640 0x40225e88:0x3ffef680 0x40226389:0x3ffef6a0 0x4025e978:0x3ffef6c0 0x4025ef89:0x3ffef6e0 0x40260454:0x3ffef700 0x40260514:0x3ffef760 0x402600bb:0x3ffef770
0x402234de: xQueueGenericSend at /Users/cmarrin/esp/ESP8266_RTOS_SDK/components/freertos/freertos/queue.c:2332
0x40225e88: sys_mbox_post at /Users/cmarrin/esp/ESP8266_RTOS_SDK/components/lwip/port/esp8266/freertos/sys_arch.c:408
0x40226389: tcpip_api_call at /Users/cmarrin/esp/ESP8266_RTOS_SDK/components/lwip/lwip/src/api/tcpip.c:408
0x4025e978: tcpip_adapter_start_dhcp at /Users/cmarrin/esp/ESP8266_RTOS_SDK/components/tcpip_adapter/tcpip_adapter_lwip.c:1220
0x4025ef89: tcpip_adapter_dhcpc_start at /Users/cmarrin/esp/ESP8266_RTOS_SDK/components/tcpip_adapter/tcpip_adapter_lwip.c:1220
0x40260454: system_event_sta_connected_handle_default at /Users/cmarrin/esp/ESP8266_RTOS_SDK/components/esp8266/source/event_default_handlers.c:126
0x40260514: esp_event_process_default at /Users/cmarrin/esp/ESP8266_RTOS_SDK/components/esp8266/source/event_default_handlers.c:308
0x402600bb: esp_event_loop_task at /Users/cmarrin/esp/ESP8266_RTOS_SDK/components/esp8266/source/event_loop.c:92
所有这些代码指针都使用 ASCII 颜色,因此它们更显眼。
您为 IDFMonitor 提供一个指向 elf 文件的指针,它使用 addr2line 查找代码空间中的任何十六进制值,并在源文件中打印该行。它使查看崩溃发生的位置变得非常容易,或者至少在崩溃的位置附近。
您可以使用 IDF Monitor 作为 Arduino 的控制台,但它几乎没有提供有用的信息。它可能会为您提供当前 PC 的代码行,但这通常是对某事的中止或断言。问题是 Arduino 生成的崩溃转储没有将它的十六进制数字格式化为开头为 0x 并且它似乎没有转储整个堆栈跟踪。
是否有类似的机制可以使 Arduino 上的崩溃调试更容易,或者是否有更有用的替代崩溃转储输出?