Cortex-MターゲットをOpenOCD + GDBでデバッグする(gdb-dashboard or VSCode)

OpenOCDとGDBを使ったarmのCortex-Mターゲットのデバッグ方法についてまとめておく。
個人的に、CUIベースでのデバッグにはgdb-dashboardGUIベースでのデバッグには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

f:id:ryochack:20180212230847p:plain

CUIGDBをグラフィカルに表示してくれる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]

f:id:ryochack:20180212230927p:plain

VSCodeからOpenOCD + GDBでCortex-Mターゲットをデバッグする場合には、Cortex-Debug extensionをインストールするのがおすすめ。 (後述するが、自前でGDBの設定をするとOpenOCDの手動で起動する必要があるが、このextensionを使うとOpenOCDを自動で起動してくれるようになる)

Cortex-Debug - Personal

gdb-dashboardをインストールして~/.gdbinitが有効になっているとVSCodeデバッグがうまく動かなくなるので、~/.gdbinit.bkなどにリネームして無効にする。

インストール

  1. VSCodeをインストールする
  2. Cortex-Debug extensionをVSCodeにインストールする

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上でF5キーを押してデバッグを開始する。

VSCode (Cortex-Debug Extension無し)

f:id:ryochack:20180212230941p:plain

蛇足になるが、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キーを押してデバッグを開始する。

参考