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 コマンドです。これは、マイクロコントローラーにプログラムを書き込み、OpenOCD セッションに接続していることを前提としています。

一般的なデバッグ

注: 以下に示すコマンドの多くは短縮形で実行できます。たとえば、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 の値を表示

OpenOCD をリモートで制御する

  • monitor reset run: CPU をリセットし、最初から実行を開始
    • monitor reset: 上記と同じ
  • monitor reset init: CPU をリセットし、開始位置で実行を停止
  • monitor targets: 現在のターゲットの情報と状態を表示