開発時以外でESP32のシリアルログからバックトレースする方法
ESP32の環境では、開発時は勝手にバックトレースしてどこのコードか教えてくれますが、その時以外の方法を残しておきます
https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/tools/idf-monitor.html
ESP32ではエラーがでるとこんな感じのログが吐かれます。
Guru Meditation Error of type StoreProhibited occurred on core 0. Exception was unhandled.
Register dump:
PC : 0x400f360d PS : 0x00060330 A0 : 0x800dbf56 A1 : 0x3ffb7e00
A2 : 0x3ffb136c A3 : 0x00000005 A4 : 0x00000000 A5 : 0x00000000
A6 : 0x00000000 A7 : 0x00000080 A8 : 0x00000000 A9 : 0x3ffb7dd0
A10 : 0x00000003 A11 : 0x00060f23 A12 : 0x00060f20 A13 : 0x3ffba6d0
A14 : 0x00000047 A15 : 0x0000000f SAR : 0x00000019 EXCCAUSE: 0x0000001d
EXCVADDR: 0x00000000 LBEG : 0x4000c46c LEND : 0x4000c477 LCOUNT : 0x00000000
Backtrace: 0x400f360d:0x3ffb7e00 0x400dbf56:0x3ffb7e20 0x400dbf5e:0x3ffb7e40 0x400dbf82:0x3ffb7e60 0x400d071d:0x3ffb7e90
この部分をバックトレースします。
Backtrace: 0x400f360d:0x3ffb7e00 0x400dbf56:0x3ffb7e20 0x400dbf5e:0x3ffb7e40 0x400dbf82:0x3ffb7e60 0x400d071d:0x3ffb7e90
0x400f360d:0x3ffb7e00
, 0x400dbf56:0x3ffb7e20
2つで一つのアドレスデータになっています。
ビルドしたときのelf
ファイルを用意し、先ほどのアドレスを下記のコマンドのように入れコマンドを実行するとバックトレースされます
xtensa-esp32-elf-addr2line -pfiaC -e arduino.elf 0x400f360d:0x3ffb7e00
こんなふうに応答があり、どこのファイルのどの行なのかを確認できます。
0x400f360d: nvs::nvs_flash_read(unsigned int, void*, unsigned int) at ...src/nvs_ops.cpp:70