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をリセットし、実行を最初からやり直します