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