GDB の使い方
以下は、プログラムのデバッグに役立つ便利な GDB コマンドです。ここでは、マイクロコントローラにプログラムを書き込み、GDB を cargo-embed セッションに接続していることを前提としています。
一般的なデバッグ
注: 以下に示すコマンドの多くは短縮形で実行できます。たとえば、
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の値を表示します
cargo-embed をリモートで制御する
monitor reset: CPU をリセットし、最初から実行を開始します