Cortex-MターゲットをOpenOCD + GDBでデバッグする(gdb-dashboard or VSCode)
OpenOCDとGDBを使ったarmのCortex-Mターゲットのデバッグ方法についてまとめておく。
個人的に、CUIベースでのデバッグにはgdb-dashboard、GUIベースでのデバッグにはVSCodeを使うのが好みなため、この2つのUIを介してデバッグする方法についてそれぞれ書くことにする。
なお、動作確認環境はArchLinux。
※OpenOCDでのFWの書き込み方法については、"OpenOCD + ST-LinkでFirmware書き込み"も参照。
共通で必要なもの
gdb-dashboardを使う場合も、VSCodeを使う場合も以下がそれぞれ必要になる。 ([]内は動作確認時のバージョン情報)
- OpenOCD [0.10.0]
- arm-none-eabi-gdb [8.1]
- ターゲットに書き込むelfファイル
- Cortex-Mターゲット(この記事ではSTMicroelectronicsのNUCLEO-F401REを使用)
- ST-Linkなどのデバッガ(この記事ではNUCLEO-F401REにオンボードで載っているのでそれを使う)
gdb-dashboard
cyrus-and/gdb-dashboard: Modular visual interface for GDB in Python
CUIのGDBをグラフィカルに表示してくれるPyhtonスクリプト。 CUIからちょっとデバッグしたい時に便利。
インストール
以下の方法でインストールできる。(gdb-dashboardのREADMEではwget
を使っているが、更新に追従できるようにここではgit clone
を使用する)
$ git clone https://github.com/cyrus-and/gdb-dashboard.git $ cp gdb-dashboard/.gdbinit ~/.gdbinit
デバッグ手順
まず、OpenOCDを起動する。
$ openocd -f board/st_nucleo_f4.cfg
-f board/st_nucleo_f4.cfg
の部分はターゲットに応じて適宜変更する。(ArchLinuxの場合は、/usr/share/openocd/scriptsにOpenOCDの設定ファイルが配置されている)
別の端末からGDBを起動し、以下のコマンドを順次打ち込む。
$ arm-none-eabi-gdb ${target_elf_path} >>> target remote localhost:3333 >>> interrupt >>> monitor reset halt >>> load
これで準備が整った。 ここからブレイクポイントを設定するなり、ステップ実行するなりしてデバッグを行う。
以下は、main.rsというファイルの7行目にブレイクポイントを設定してプログラムを実行する例となる。
>>> tbreak main.rs:7 >>> continue
VSCode + Cortex-Debug Extension
Visual Studio Code - Code Editing. Redefined
- VSCode [1.19.0]
- Cortex-Debug Extension [0.1.14]
VSCodeからOpenOCD + GDBでCortex-Mターゲットをデバッグする場合には、Cortex-Debug extensionをインストールするのがおすすめ。 (後述するが、自前でGDBの設定をするとOpenOCDの手動で起動する必要があるが、このextensionを使うとOpenOCDを自動で起動してくれるようになる)
※gdb-dashboardをインストールして~/.gdbinit
が有効になっているとVSCodeのデバッグがうまく動かなくなるので、~/.gdbinit.bk
などにリネームして無効にする。
インストール
VSCodeのデバッグ構成ファイルを用意する
VSCodeでデバッグするためには launch.json というデバッグ構成を記載するための設定ファイルを書く必要がある。
Cortex-Debug extensionを使う際には、以下のように launch.json を書く(launch.json の修正までの手順は"デバッグ | 非公式 - Visual Studio Code Docs"の記事を参考に)
launch.json
{ "version": "0.2.0", "configurations": [ { "type": "cortex-debug", "servertype": "openocd", "request": "launch", "name": "OpenOCD-Debug", "executable": "${ターゲットELFまでのPATH}", "configFiles": [ "board/st_nucleo_f4.cfg" ], "cwd": "${workspaceRoot}", "gdbpath": "arm-none-eabi-gdb", } ] }
※なお、Cortex-Debug extensionはOpenOCDだけではなく、J-Linkにも対応している模様。
デバッグ手順
VSCode (Cortex-Debug Extension無し)
蛇足になるが、VSCodeでCortex-Debug extensionを使わない場合のやり方も残しておく。
※こちらも同様に、gdb-dashboardをインストールして~/.gdbinit
が有効になっているとVSCodeのデバッグがうまく動かなくなるので、~/.gdbinit.bk
などにリネームして無効にする。
VSCodeのデバッグ構成ファイルを用意する
以下の launch.json を用意する。
launch.json
{ "version": "0.2.0", "configurations": [ { "name": "OpenOCD Debug", "type": "gdb", "request": "attach", "executable": "${ターゲットELFまでのPATH}", "remote": true, "target": ":3333", "cwd": "${workspaceRoot}", "gdbpath": "arm-none-eabi-gdb", "autorun": [ "interrupt", "monitor reset halt", "load", ], } ] }
デバッグ手順
まず、OpenOCDを起動する(-f board/st_nucleo_f4.cfg
の部分はターゲットに応じて適宜変更する)
$ openocd -f board/st_nucleo_f4.cfg
OpenOCDが起動できたら、VSCode上でF5キーを押してデバッグを開始する。