概要
SPRESENSE Aruduino エラー解析をした際の自分用メモ。SPRESENSE Aruduino エラー解析をするときに、やり方をいちいち調べながらやったので、今後調べなくていいように自分用にメモする。
詳細
1. 状況
以下のように、実行中にクラッシュしエラーが吐かれた場合について
[2026-01-25 11:45:11.017] arm_hardfault: Hard Fault escalation: [2026-01-25 11:45:11.017] arm_hardfault: PANIC!!! Hard Fault!: [2026-01-25 11:45:11.023] arm_hardfault: IRQ: 3 regs: 0xd0897d8 [2026-01-25 11:45:11.023] arm_hardfault: BASEPRI: 000000e0 PRIMASK: 00000000 IPSR: 00000003 CONTROL: 00000000 [2026-01-25 11:45:11.034] arm_hardfault: CFSR: 00008200 HFSR: 40000000 DFSR: 00000000 BFAR: efc9a82c AFSR: 00000000 : [2026-01-25 11:45:11.711] dump_task: 29 8 100 RR pthread --- Waiting Signal 0000000000000000 0xd098698 2040 528 25.8% imuThread 0xd0026d9 0 [2026-01-25 11:45:11.722] dump_task: 30 8 100 RR pthread --- Waiting Signal 0000000000000000 0xd098fa8 4088 2360 57.7% gnssThread 0xd002d59 0
2. エラー箇所を特定する
arm-none-eabi-addr2lineというツールを使用する。通常このツールは、
C:\Users\{ユーザー}\AppData\Local\Arduino15\packages\SPRESENSE\tools\gcc-arm-none-eabi\9.2.1\windows\bin\
にある。
そして、解析対象となるファイルは、通常
C:\Users\{ユーザー}\AppData\Local\arduino\sketches\
というフォルダに、ビルドごとにフォルダが切られ出力されていて、その中の {スケッチ名}.ino.elf である。
そして、解析対象となるアドレスは、エラーダンプの中の PC および LR である。
[2026-01-25 11:45:11.080] up_dump_register: IP: 00000001 SP: 0d0898b0 LR: 0d001dad PC: 0d001da0
なので、解析対象のファイルのあるディレクトリに移動し、arm-none-eabi-addr2lineをPC、LRに対して実行。
cd C:\Users\{ユーザー}\AppData\Local\arduino\sketches\{ID}
C:\Users\{ユーザー}\AppData\Local\Arduino15\packages\SPRESENSE\tools\gcc-arm-none-eabi\9.2.1\windows\bin\arm-none-eabi-addr2line.exe -e ./{スケッチ名}.ino.elf -f -C {アドレス}
これを実行すれば、関数名や行番号がわかる。
{関数名}
C:\Users\{ユーザー}\Documents\Arduino\SPRESENSE\{スケッチ}\{ファイル名}:{行番号}