GDB の使い方
以下は、プログラムのデバッグに役立つ GDB コマンドです。これは、マイクロコントローラーにプログラムを書き込み、OpenOCD セッションに接続していることを前提としています。
一般的なデバッグ
注: 以下に示すコマンドの多くは短縮形で実行できます。たとえば、
continueは単にc、break $locationはb $locationとして使用できます。以下のコマンドに慣れてきたら、GDB が認識しなくなる直前まで、どこまで短くできるか試してみてください!
ブレークポイントの扱い
break $location: コード内の位置にブレークポイントを設定します。$locationには次のような値を指定できます:break *main- 関数mainの正確なアドレスで停止break *0x080012f2- 正確なメモリアドレス0x080012f2で停止break 123- 現在表示中のファイルの 123 行目で停止break main.rs:123- ファイルmain.rsの 123 行目で停止
info break: 現在のブレークポイントを表示delete: すべてのブレークポイントを削除delete $n: ブレークポイント$nを削除 (nは数字。例:delete $2)
clear: 次の命令位置のブレークポイントを削除clear main.rs:$function:main.rs内の$functionのエントリにあるブレークポイントを削除clear main.rs:123:main.rsの 123 行目のブレークポイントを削除
enable: 設定済みのすべてのブレークポイントを有効化enable $n: ブレークポイント$nを有効化
disable: 設定済みのすべてのブレークポイントを無効化disable $n: ブレークポイント$nを無効化
実行の制御
continue: プログラムの実行を開始または再開next: プログラムの次の行を実行next $n:nextを$n回繰り返す
nexti:nextと同じですが、代わりに機械語命令単位で実行しますstep: 次の行を実行し、その行に別の関数呼び出しが含まれている場合はそのコードの中に入りますstep $n:stepを$n回繰り返す
stepi:stepと同じですが、代わりに機械語命令単位で実行しますjump $location: 指定した位置から実行を再開:jump 123: 123 行目から実行を再開jump 0x080012f2: アドレス 0x080012f2 から実行を再開
情報の表示
print /$f $data- 変数$dataに格納された値を表示します。必要に応じて、$fで出力形式を指定できます。指定可能な値は次のとおりです:x: hexadecimal d: signed decimal u: unsigned decimal o: octal t: binary a: address c: character f: floating pointprint /t 0xA: 16 進数の値0xAを 2 進数 (0b1010) として表示
x /$n$u$f $address:$addressのメモリを調べます。必要に応じて、$nで表示するユニット数、$uでユニットサイズ (バイト、ハーフワード、ワードなど)、$fで上記のprint形式を指定できますx /5i 0x080012c4: アドレス0x080012c4から始まる 5 個の機械語命令を表示x/4xb $pc:$pcが現在指している位置から始まる 4 バイトのメモリを表示
disassemble $locationdisassemble /r main: 関数mainを逆アセンブルし、/rを使って各命令を構成するバイトも表示します
シンボルテーブルの確認
info functions $regex:$regexに一致する関数の名前とデータ型を表示します。すべての関数を表示する場合は$regexを省略しますinfo functions main:mainという語を含む定義済み関数の名前と型を表示
info address $symbol:$symbolがメモリ上のどこに格納されているかを表示info address GPIOC: 変数GPIOCのメモリアドレスを表示
info variables $regex:$regexに一致するグローバル変数の名前と型を表示します。すべてのグローバル変数を表示する場合は$regexを省略しますptype $data:$dataに関するより詳細な情報を表示ptype cp: 変数cpの詳細な型情報を表示
プログラムスタックの調査
backtrace $n:$nフレーム分のトレースを表示します。すべてのフレームを表示する場合は$nを省略しますbacktrace 2: 最初の 2 フレームのトレースを表示
frame $n: 番号またはアドレス$nのフレームを選択します。現在のフレームを表示する場合は$nを省略しますup $n:$nフレーム上を選択down $n:$nフレーム下を選択info frame $address:$addressにあるフレームを説明します。現在選択されているフレームの場合は$addressを省略しますinfo args: 選択中のフレームの引数を表示info registers $r: 選択中のフレームにおけるレジスタ$rの値を表示します。すべてのレジスタを表示する場合は$rを省略しますinfo registers $sp: 現在のフレームで、スタックポインタレジスタ$spの値を表示
OpenOCD をリモートで制御する
monitor reset run: CPU をリセットし、最初から実行を開始monitor reset: 上記と同じ
monitor reset init: CPU をリセットし、開始位置で実行を停止monitor targets: 現在のターゲットの情報と状態を表示