ESP32を開発時に、Arduino IDEのコンソールで表示されるBacktraceをちゃんと読み解く。
0. 試した環境
MAC: 12.5.1(Monterey)
Arduino IDE: 1.8.19
1. 環境設定
ツールをインストール
$ mkdir -p ~/esp
$ cd ~/esp
$ wget https://dl.espressif.com/dl/xtensa-esp32-elf-macos-1.22.0-97-gc752ad5-5.2.0.tar.gz
$ tar -xzf xtensa-esp32-elf-macos-1.22.0-97-gc752ad5-5.2.0.tar.gz
パスを設定
.zshrc
# 下記を適当な場所に追加
export PATH=$HOME/esp/xtensa-esp32-elf/bin:$PATH
alias get_esp32="export PATH=$HOME/esp/xtensa-esp32-elf/bin:$PATH"
.zshrcを読み直し
$ source .zshrc
2. コンパイル済みのファイルを取得
↓Arduino IDEでコンパイル時に下記のように出力されるパスを確認
※ もし、見つからない場合は下記でも探せるかもです。
$ cd /private/var/folders
$ find ./ -name "arduino_build_*" -ls 2> /dev/null
63836113 0 drwxr-xr-x 13 yuki staff 416 1 7 13:10 .//_l/sdy4_tn574g1_0pphk0rv0pm0000gp/T/arduino_build_368937
63836936 0 drwxr-xr-x 13 yuki staff 416 1 7 09:48 .//_l/sdy4_tn574g1_0pphk0rv0pm0000gp/T/arduino_build_526620
↑
上記の最新の日付っぽいものをもってくると良い気がします
3. 実行
※ 元のファイルが「hogehoge.ino」の場合
$ xtensa-esp32-elf-addr2line -pfiaC -e hogehoge.ino.elf 0x4008d65d:0x3ffcb5e0
↓ 下記の様な感じで出力される
0x4008d65d: esp_system_abort at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/esp_system/esp_system.c:137
4. より効率のよいデバッグ
$ perl esp32_decode_codes.pl --elf=[elf_file_full_path] --codes=[0x4008388d:0x3ffcb5c0...]
下記にまとめてtraceのメッセージを出してくれるスクリプト置いときます
esp32_decode_codes.pl
#!/usr/bin/perl
#-----------------------------
# esp32のdumpをデコードしてエラーメッセージを確認するプログラム
#
# usage: $ perl esp32_decode_codes.pl --elf=[elf_file_full_path] --codes=[0x4008388d:0x3ffcb5c0...]
#-----------------------------
use strict;
#use warnings;
use XML::Simple;
use Data::Dumper;
use File::Find::Rule;
use Smart::Options;
my $xml = XML::Simple->new(ForceArray => 1);
my $argv = Smart::Options->new->parse;
unless (defined($argv->{'elf'}) && defined($argv->{'codes'})) {
print 'usage: $ perl esp32_decode_codes.pl --elf=[elf_file_full_path] --codes=[0x4008388d:0x3ffcb5c0...]', $/;
exit;
}
decode_codes($argv->{'elf'}, $argv->{'codes'});
sub decode_codes {
my $elf_file_path = $_[0];
my $codes_as_string = $_[1];
$codes_as_string =~ s/Backtrace: //g;
my @codes = split(" ", $codes_as_string);
print "---------------------------------------------------", $/;
print "elf_file_path ", $elf_file_path, $/;
print "codes_as_string ", $codes_as_string, $/;
print "---------------------------------------------------", $/;
foreach my $code_as_string(@codes) {
my $command = "xtensa-esp32-elf-addr2line -pfiaC -e $elf_file_path $code_as_string";
print `$command`, $/;
}
print $/;
}
exit;
References