GDB チートシート

cheatsheet

目的別のGDBコマンド早見表

起動と終了

コマンド 説明 備考
gdb <実行ファイル名> 指定した実行ファイルをデバッグ対象としてGDBを起動します。 最も基本的な起動方法です。
gdb <実行ファイル名> <コアファイル名> 実行ファイルとコアダンプファイルを指定して起動します。クラッシュ後の状態を解析するのに用います。 コアダンプ解析に必須です。
gdb --pid <プロセスID> 指定したプロセスIDの実行中プロセスにアタッチします。 attach <プロセスID> でもアタッチ可能です。
gdb -tui <実行ファイル名> TUI (Text User Interface) モードで起動します。ソースコード表示ウィンドウなどが利用できます。 起動後に Ctrl + x + a でもTUIモードを切り替えられます。
run [引数...] (または r) プログラムの実行を開始します。引数を指定することも可能です。
set args [引数...] 次回のrunコマンドでプログラムに渡す引数を設定します。 引数なしで実行すると引数設定をクリアします。
show args 現在設定されているプログラム引数を表示します。
quit (または q) GDBを終了します。
help [コマンド名] GDBのヘルプを表示します。コマンド名を指定するとそのコマンドの詳細を表示します。
apropos <キーワード> キーワードに関連するコマンドを検索します。 コマンド名が思い出せない時に便利です。

ブレークポイント 🛑

プログラムの実行を特定の場所で一時停止させるためのコマンドです。

コマンド 説明 備考
break <場所> (または b) 指定した場所(関数名、行番号、アドレスなど)にブレークポイントを設定します。 例: b main, b my_file.c:123, b *0x4005a0
break <場所> if <条件式> 指定した条件式が真の場合のみ停止する条件付きブレークポイントを設定します。 例: b 123 if i == 10
tbreak <場所> 一時的なブレークポイントを設定します。一度ヒットすると自動的に削除されます。 特定の箇所で一度だけ止めたい場合に便利です。
rbreak <正規表現> 指定した正規表現にマッチする全ての関数にブレークポイントを設定します。 C++のオーバーロードされた関数などに便利です。
watch <式> 指定した式(通常は変数)の値が変化したときに停止するウォッチポイントを設定します。 読み込み時、書き込み時を区別するには rwatch (読み込み時), awatch (読み書き時) もあります。ハードウェアウォッチポイントは hbreak, thbreak など。
info breakpoints (または i b) 設定されている全てのブレークポイントとウォッチポイントの情報を表示します。 番号、タイプ、有効/無効、アドレス、場所などが表示されます。
delete [番号] (または d) 指定した番号のブレークポイント/ウォッチポイントを削除します。番号を省略すると全てのブレークポイントを削除します(確認あり)。
clear <場所> 指定した場所(関数名や行番号)に設定されているブレークポイントを削除します。
disable [番号] 指定した番号のブレークポイント/ウォッチポイントを一時的に無効化します。番号を省略すると全てを無効化します。
enable [番号] 指定した番号の無効化されたブレークポイント/ウォッチポイントを有効化します。番号を省略すると全てを有効化します。
condition <番号> [<条件式>] 指定した番号のブレークポイントに条件式を設定します。条件式を省略すると条件を削除します。
ignore <番号> <回数> 指定した番号のブレークポイントを、指定した回数だけ無視します。 ループ内で特定回数だけ通過させたい場合に便利です。
commands [<番号>] ... end 指定した番号のブレークポイントにヒットしたときに自動実行されるGDBコマンドを設定します。番号を省略すると最後に設定されたブレークポイントが対象になります。 例:
commands 1
  silent
  printf "Hit breakpoint 1, x = %d\n", x
  continue
end

ステップ実行 ▶️

プログラムの実行を1行ずつ、または特定の箇所まで進めるためのコマンドです。

コマンド 説明 備考
step (または s) 次のソース行を実行します。関数呼び出しがある場合は、その関数の中に入ります(ステップイン)。
next (または n) 次のソース行を実行します。関数呼び出しがあっても、その関数を実行し終えてから次の行で停止します(ステップオーバー)。
stepi (または si) 次の機械語命令を実行します。 アセンブリレベルでのデバッグ時に使用します。
nexti (または ni) 次の機械語命令を実行します。関数呼び出しはステップオーバーします。 アセンブリレベルでのデバッグ時に使用します。
finish (または fin) 現在の関数を最後まで実行し、呼び出し元に戻った直後で停止します。 関数から抜け出したい時に使います。
until [<場所>] (または u) 現在のスタックフレーム内で、指定した場所(行番号など)まで実行を続けます。場所を省略すると、現在の行より後の行に進むまで実行します。 ループを抜け出すのに便利です。
continue [<回数>] (または c) 次のブレークポイントまたはプログラム終了まで実行を継続します。回数を指定すると、その回数だけブレークポイントを無視します。
jump <場所> プログラムの実行位置を指定した場所(行番号やアドレス)に移動させます。 注意して使用する必要があります。予期せぬ動作を引き起こす可能性があります。
return [<値>] 現在の関数から強制的にリターンします。戻り値を指定することも可能です。 指定した箇所以降の処理は実行されません。
advance <場所> 指定した場所まで実行を継続します。もしその場所に到達する前に関数が終了した場合は、そこで停止します。 特定の関数内の目的地まで安全に進みたい場合に便利です。
record リバースデバッグ(実行を逆行させる)のための記録を開始します。 環境によっては利用できない場合があります。
reverse-step (または rs) 記録された実行履歴を1ステップ戻します。 record 実行後に使用します。
reverse-next (または rn) 記録された実行履歴を1行分戻します(関数呼び出しは戻りません)。 record 実行後に使用します。
reverse-continue (または rc) 記録された実行履歴を前のブレークポイントや停止位置まで戻します。 record 実行後に使用します。
reverse-finish 記録された実行履歴を現在の関数が呼び出される直前まで戻します。 record 実行後に使用します。

情報表示 🔍

変数、メモリ、スタック、レジスタなどの情報を表示するためのコマンドです。

コマンド 説明 備考
print [<形式>] <式> (または p) 指定した式(変数、定数、計算など)の値を評価して表示します。形式を指定して表示形式を変更できます。 形式: /x (16進), /d (10進), /u (符号無10進), /o (8進), /t (2進), /a (アドレス), /c (文字), /f (浮動小数点), /s (文字列)。
例: p my_var, p/x my_var, p *ptr, p array[0]@10 (配列要素10個表示), p $rax (レジスタ)
x/[N][F][U] <アドレス> 指定したメモリアドレスの内容を表示します。N: 表示数, F: フォーマット, U: ユニットサイズ。 フォーマット(F): x, d, u, o, t, a, c, f, s (文字列), i (命令)
ユニットサイズ(U): b (byte), h (halfword, 2B), w (word, 4B), g (giant word, 8B)
例: x/16xw $rsp (スタックポインタから16ワードを16進表示), x/s str_ptr (文字列ポインタの先の文字列表示), x/i $pc (現在の命令)
display [<形式>] <式> ステップ実行ごとに指定した式の値を自動的に表示します。 info display で一覧表示、undisplay <番号> で解除。
info locals (または i lo) 現在のスタックフレームのローカル変数を表示します。
info args 現在のスタックフレームの関数引数を表示します。
info frame (または i f) 現在のスタックフレームの詳細情報(アドレス、呼び出し元など)を表示します。
info stack (または i s) 現在のスタックフレームのバックトレースと引数、ローカル変数を表示します。 より詳細なスタック情報。
backtrace [N] (または bt, where) 現在の関数呼び出しのスタックトレース(バックトレース)を表示します。Nを指定すると表示するフレーム数を制限できます。 クラッシュ箇所や呼び出し階層の確認に必須です。
frame <番号> (または f) 指定した番号のスタックフレームを選択します。これ以降の変数表示などは選択したフレームが基準になります。 bt で表示される番号を使います。
up [N] スタックフレームをN個分、呼び出し元方向に移動します(デフォルトは1)。
down [N] スタックフレームをN個分、呼び出し先方向に移動します(デフォルトは1)。
list [<場所>] (または l) 現在の実行行付近、または指定した場所のソースコードを表示します。 例: l, l main, l my_file.c:100
disassemble [<場所>] (または disas) 指定した関数やアドレス範囲の逆アセンブル結果を表示します。場所を省略すると現在の関数を表示します。 disas /m でソースコードと混合表示。
info registers [<レジスタ名>...] (または i r) 指定したレジスタ(省略時は主要レジスタ)の内容を表示します。 例: i r rax rsp, i r all (全レジスタ)
info threads 現在存在する全てのスレッドの情報を表示します。 マルチスレッドデバッグ時に使用します。
info proc mappings プロセスのメモリマッピング情報を表示します。
ptype <式/型名> 指定した式や変数、型名の型定義を表示します。 構造体やクラスの定義を確認するのに便利です。
whatis <式> 指定した式のデータ型を表示します。
info macro <マクロ名> 指定したマクロの定義を表示します。(コンパイル時に-g3オプションが必要)
set print elements <数> 配列や文字列を表示する際の最大要素数を設定します。0で無制限。 長い配列全体を見たい時に set print elements 0 を使います。
set print pretty on 構造体やクラスの表示を整形(pretty print)します。 見やすくなります。

マルチスレッドデバッグ 🧵

複数のスレッドを持つプログラムをデバッグするためのコマンドです。

コマンド 説明 備考
info threads 全てのスレッドのリスト(ID、状態、現在の位置など)を表示します。カレントスレッドには `*` が付きます。
thread <スレッドID> 指定したIDのスレッドをカレントスレッドに切り替えます。 info threads で表示されるGDB内のIDを使用します。
thread apply <スレッドIDリスト|all> <コマンド> 指定したスレッド(または全てのスレッド)に対してGDBコマンドを実行します。 例: thread apply all bt (全スレッドのバックトレースを表示)
break <場所> thread <スレッドID> [if <条件>] 特定のスレッドでのみ有効なブレークポイントを設定します。
set scheduler-locking <on|off|step> スレッドスケジューリングの制御方法を設定します。 on: カレントスレッドのみ実行を許可。
off: 全てのスレッドを自由に実行(デフォルト)。
step: ステップ実行時のみカレントスレッドを実行。
set non-stop <on|off> ノンストップモードを有効/無効にします。 on の場合、1つのスレッドが停止しても他のスレッドは実行を続けます。

コアダンプ解析 💥

プログラムがクラッシュした際に生成されるコアダンプファイルを解析するためのコマンドです。(多くは情報表示コマンドと共通)

コマンド 説明 備考
gdb <実行ファイル> <コアファイル> コアダンプファイルを読み込んでGDBを起動します。 まずこのコマンドで解析を開始します。
core-file <コアファイル> GDB起動後にコアダンプファイルを読み込みます。
bt (または backtrace, where) クラッシュ時のスタックトレースを表示します。 原因究明の第一歩として最も重要なコマンドです。
frame <番号> (または f) スタックフレームを移動し、その時点での変数の状態などを確認します。
info locals / info args 選択したフレームでのローカル変数や引数の値を表示します。 クラッシュ時の変数の値を確認できます。
print <変数名> 特定の変数の値を表示します。
list クラッシュした箇所のソースコードを表示します。
info registers クラッシュ時のレジスタの内容を表示します。 低レベルな解析に役立ちます。
disassemble クラッシュ箇所付近の逆アセンブルコードを表示します。

その他の便利なコマンド ✨

コマンド 説明 備考
set variable <変数> = <値>
(または p <変数> = <値>)
デバッグ中に変数の値を変更します。 動作確認や特定の条件を作り出すのに使えます。
call <関数呼び出し> プログラム内の関数を直接呼び出します。 例: call my_function(10, "test")。状態を変更する可能性があるため注意が必要です。
dprintf <場所>, <書式文字列>[, 引数...] 動的なprintf。指定した場所に到達したときに、printfのように書式指定で値を出力します。ソース変更不要です。 内部的にはブレークポイントとcommandsコマンドを利用しています。
Ctrl + x + a
Ctrl + x + 1
Ctrl + x + 2
TUI (Text User Interface) モードの切り替え・制御。 Ctrl + x + a: TUIモードの有効/無効切り替え。
Ctrl + x + 1: ソース/アセンブリウィンドウのみを表示。
Ctrl + x + 2: 複数のTUIウィンドウ(ソース、アセンブリ、レジスタなど)を順番に表示。
Ctrl + l: TUI画面の再描画。
set follow-fork-mode <parent|child> fork() した際に、親プロセスと子プロセスのどちらをデバッグ対象とするかを設定します。 デフォルトは parent です。
set detach-on-fork <on|off> fork() 時に、デバッグ対象でない方のプロセスをデタッチ(GDBの制御から外す)するかどうかを設定します。 デフォルトは on です。
info inferiors 現在GDBが管理しているプロセス(inferior)のリストを表示します。 set detach-on-fork off の場合に使用します。
inferior <番号> 操作対象のプロセスを切り替えます。 info inferiors で表示される番号を使います。
shell <コマンド> GDB内からシェルコマンドを実行します。 例: shell ls -l
source <ファイル名> 指定したファイルからGDBコマンドを読み込んで実行します。 .gdbinit ファイルは起動時に自動的に読み込まれます。
define <コマンド名> ... end ユーザー定義のGDBコマンドを作成します。 定型的な操作をまとめるのに便利です。

コメント

タイトルとURLをコピーしました