Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

GDBの使い方

以下は、プログラムのデバッグに役立つGDBコマンドです。ここでは、マイクロコントローラーにプログラムを書き込み、GDBを cargo-embed セッションに接続していることを前提としています。

一般的なデバッグ

注: 以下に示すコマンドの多くは短縮形で実行できます。たとえば、continue は単に cbreak $locationb $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 point
    
    • print /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 $location
    • disassemble /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をリセットし、実行を最初からやり直します