Arduino で ESP32 のプログラムを開発中、一度は Guru Meditation Error など、強制的にリセットがかかってしまう Exception was unhandled な経験をしたことがあると思います。

そんな時、従来は Exception Stack Trace Decoderaddr2line が利用されてきたと思いますが、前者の .jar ファイルは僕の環境で動かないし、後者は CLI が面倒。

と言うことで、ドラッグ&ドロップ+コピペ OK の Web サイト ESP Stack Trace Decoder を紹介します。

ESP Stack Trace Decoder
ESP Stack Trace Decoder

ESP Stack Trace Decoder の使い方

  1. Web サイト を開きます。

  2. ファイルを選択」のボタンに .elf ファイルをドラッグ&ドロップします。

  3. Arduino IDE のシリアルモニタから Backtrace: の16進数の塊をコピーし、Stack trace: に貼り付けます。

    Backtraceをコピー
  4. Run! ボタンでアドレスと関数の行番号リストが Output: に表示されるので、エラーの発生経路を追跡します。

ELF ファイルの見つけ方

ELF ファイルはコンパイル時にキャッシュフォルダに作成されます。このキャッシュフォルダは Arduino IDE のバージョン 2.3.4 前後で異なるので、コンパイル時の情報を見るのが一番確実な方法です。

  1. IDE メニューから「Arduino IDE > 基本設定…」からダイアログを開きます。

  2. より詳細な情報を表示する」の「コンパイル」をチェックし、「OK(O)」します。

    基本設定
  3. 検証」ボタン 検証ボタン で再コンパイルします。

  4. 出力」タブから「プロジェクト名.ino.elf」を含む行、あるいは「以前コンパイルされたファイルを使用中:」の行からキャッシュフォルダへのパスをコピーします。

    キャッシュフォルダのコピー
  5. コピーしたパスをエクスプローラー(Windows)またはファインダー(Mac)で開いたら、「プロジェクト名.ino.elf」を検索します。

ELF ファイルへの素早いアクセス方法

Arduino キャッシュフォルダへのショートカット(Windows)またはエイリアス(Mac)を作成しておくのが良いでしょう。

Windows の場合

エクスプローラーのアドレスバーに %localappdata% を入力し、上記でコピーしたパスを辿るのが手っ取り早いと思います。

Mac OS の場合

ファインダーを開き、Shift + Command ⌘ + G またはメニューの「移動 > フォルダへ移動…」からダイアログを開き、コピーしたフォルダへのパスをペーストします。

ブラウザから「ファイルを選択」した場合は、Shift + Command ⌘ + .(ピリオド)で隠しフォルダを表示し、「Macintosh HD」からユーザーフォルダの「ライブラリ > Caches > Arduino > Sketches」へと辿ることが出来ます。

ELFファイルの選択

ESP Stack Trace Decoder って?

このクールなサイトは、maximeborges/esp-stacktrace-decoder の GitHub Pages にホストされています。

RustWebAssembly アプリケーションとして作成されていて、サーバーへのホスト方法も解説されているので、自分専用を作ることも可能と思います。

余談ですが、つい先日までちょっとした不具合があり、修正用の PR も放置されていたので、これを機会に Rust の勉強も兼ねて自分でホストしようと試みたのですが、僕の Mac が古いためか Rust がうまくインストール出来ませんでした 💦

でも お願いしたら直ぐに対応してくれました ⛳️ メデタシ、メデタシ。

参考