Arduino UNO R4 WiFi スタックトレースデバッグ

ランタイムエラーが発生したときにCoretex-M4プロセッサから情報を取得する方法を学びます。


AUTHOR: Sebastian Wikström


Arduino UNO R4 WiFiは、ランタイムエラーが発生したときに、CmBacktraceを使い、Arm Core M4プロセッサからの有用な情報を、シリアル出力に表示します。出力にはaddr2lineコマンドを含み、エラーの発生元を見つけるために利用するスタックトレース(スタックバックトレースやスタックトレースバックとも呼ばれます)を生成するのに使われます。

このチュートリアルでは、この機能の使い方を示します。

必要なハードウェアとソフトウェア

ランタイムエラーを見る

シリアルモニタにランタイムエラー情報を取得するには、以下のステップに従ってください。

  1. スケッチでSerial.begin()を呼び出し、エラーが発生する前にシリアル接続が開始されていることを確認します。setup()関数の最初に以下のコードを含めます。
1
2
Serial.begin(115200);
while (!Serial);
  1. UNO R4 WiFiボードをPCに接続します。

  2. シリアルモニタを開きます。右上のシリアルモニタボタンをクリックするか、

シリアルモニタのアイコン

シリアルモニタのアイコン

メニューバーの、「ツール > シリアルモニタ」を選択します。

  1. スケッチを変更したら、書き込みボタンをクリックするか、
書き込みボタンのアイコン

書き込みボタンのアイコン

ボードのリセットボタンを押します。

  1. ボードで例外が発生すると、情報がシリアルモニタに表示されます。
シリアル出力

シリアル出力

  1. 「Register information」テーブルに従い、エラーの型が指定されます。型についての詳細は、ここ記載されています。

  2. 最終行はaddr2lineユーティリティのコマンドが含まれています。addr2lineコマンドを実行するを参照してください。

スタックトレースを生成する

addr2lineツールを使って、スタックトレースを生成することができます。以下の用例を見てください。

注意: addr2lineはWindows アプリケーションとしては利用できません。しかし、Windows Subsystem for Linux(WSL)上では動作します。

addr2lineユーティリティは、Arduino UNO R4ボードパッケージに含まれています。しかし、この方法で動作させるには、出力に含まれるコマンドを修正する必要があります。便利なので、addr2lineをシステムにインストールしておくといいと思います。

addr2line(オプション)をインストールするには、以下のOS別の手順に従ってください。

  • Windows(WSL): addr2lineは、Windowsアプリとしては動作しません。しかし、Windows Subsystem for Linux上で動作します。LinuxのUbuntuディストリビューションがデフォルトでインストールされ、そこにaddr2lineが含まれています。
  • macOS: addr2lineは、Homebrewを使い、ターミナルでbrew install binutilsを実行するとインストールできます。
  • Linux: addr2lineは、恐らくインストールされています。インストールされていなければ、apt-get install binutilsをターミナルで実行してください(Ubuntu、Debian)。他のディストリビューションでは、command-not-found.com/addr2lineを参照してください。

addr2lineコマンドをコピーする

Windows(WSL)

  1. シリアル出力からコマンドをコピーする
  2. テキストエディタにコマンドをペーストする
  3. C:/mnt/cに置き換え、全てのバックスラッシュ(\)をスラッシュ(/)に置き換える。

macOS

シリアル出力からコマンドをコピーする(修正不要です)。

Linux

シリアル出力からコマンドをコピーする(修正不要です)。

i
addr2lineをインストールしたくなければ、ボードパッケージに付属のaddr2lineを利用できます。追加の手順に従ってください。

addr2lineコマンドを実行する

注意: スケッチは、addr2lineを実行するPCと同じPC上でコンパイルされている必要があります。

Windows(WSL)

  1. Windows Powershellを開く
  2. Windows Powershellで、Ubuntuトタイプし、エンターキーを押す
  3. 修正したコマンドを、右クリックでWindows Powershellにペーストする
  4. コマンドを実行するためにエンターキーを押す

macOS

  1. ターミナルを開く
  2. ⌘ + Vを押し、コマンドをペーストする
  3. コマンドを実行するためにエンターキーを押す

Linux

  1. ターミナルを開く
  2. Ctrl + ⇧Shift + Vを押し、コマンドをペーストする
  3. コマンドを実行するためにエンターキーを押す

オプションで、-pフラグをつければ、読みやすいフォーマットになります。

addr2lineの出力を読む

デフォルトで、コマンドは、各関数呼び出しに対して以下を出力します。

  • アドレス: “0x00004188”,"0x0000426e",…(これが不要なら-aフラグを削除してください)
  • 関数名: “_ZN4UART5writeEh”, “loop”, …
  • 行番号:"/Users/sebastianwikstrom/Documents/Arduino/ErrorInducer/ErrorInducer.ino:67", …

以下の手順に従ってください。

  1. スケッチ内の出力の最上行を探してください。パスの後の数字が、エラーがおこった行番号です。例えば、/Users/username/Documents/Arduino/ErrorInducer/ErrorInducer.ino:67であれば、67行目でエラーが起こったことを示しています。出力を読み進めると、関数呼び出しが行われたステップをさかのぼることができます。
ターミナルでaddr2lineのスタックトレースを読む

ターミナルでaddr2lineのスタックトレースを読む

  1. Arduino IDEでスケッチを開き、先ほどのステップでの行番号を探してください(番号は各行の左側に表示されています)

  2. エラーが起こった行を解析し、なぜエラーが起こったのか理解するよう努めてください

  • わからない場合は、Serial.println()関数で、使われている変数の値を出力してください。その後、スケッチを再度アップロードし、エラーが起こる前にそれらの変数がどのような状態であったかを、シリアル出力を使い、見てください。
  • どこから関数が呼ばれたかを知るには、addr2line出力の、先行する関数を見てください。

この例では、while(true)ループで何回かの繰り返し後、 numbers配列の領域外へのアクセスが起こります。

コードを解析する

コードを解析する

追加の手順

addr2lineコマンドをコピーする(ボードパッケージ)

i
この手順は、addr2lineコマンドをコピーするの手順を置き換えます。

ボードパッケージのaddr2lineを直接使う場合は、以下の手順に従ってください。

Windows(WSL)

  1. シリアル出力からコマンドをコピーする
  2. テキストエディタにコマンドをペーストする
  3. addr2line/mnt/c/Users/User/Appdata/Local/Arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-addr2lineに置き換える
  4. -eフラグ以降のファイルパスについて、C:/mnt/cに置き換え、全てのバックスラッシュ(\)をスラッシュ(/)に置き換える。

macOS

  1. シリアル出力からコマンドをコピーする
  2. テキストエディタにコマンドをペーストする
  3. addr2line/Library/Arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-addr2lineに置き換える

Linux

  1. シリアル出力からコマンドをコピーする
  2. テキストエディタにコマンドをペーストする
  3. addr2line.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-addr2lineに置き換える

オリジナルのページ

https://docs.arduino.cc/tutorials/uno-r4-wifi/stack-trace

最終更新日

November 13, 2023

inserted by FC2 system