gdb について
エージェント向けの GDB 実践ガイドです。基本操作からクラッシュ解析、リバースデバッグ、リモートデバッグ、マルチスレッドの調査まで扱い、よくある問題の対処法も示します。
主な機能
- 01GDBセッションの開始と操作
- 02条件付きブレークポイントとウォッチポイント
- 03変数、メモリ、スレッドの調査
- 04実行の記録とリプレイ
- 05gdbserverによるリモート接続
- 06シンボルやバックトレースの問題解決
活用シーン
- 01コアダンプやバックトレースによるクラッシュ調査
- 02変数が条件を満たした時点での停止
- 03マルチスレッドプログラムの状態確認
- 04実行をリプレイして不具合を特定
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ mohitmishra786/ low-level-dev-skills --skill gdbインストール後、Claude Code で/gdbを入力して読み込まれたか確認します。
同梱ファイルreferences/cheatsheet.mdreferences/scripting.md
詳細
GDB
目的
初回起動から高度なワークフローまで、GDB セッションをエージェントが進められるようにします。クラッシュの診断、逆方向デバッグ、リモートデバッグ、マルチスレッドの調査を扱います。
トリガー
- 「プログラムがセグフォルト/クラッシュします。どうデバッグすればよいですか?」
- 「条件 X でブレークポイントを設定するにはどうすればよいですか?」
- 「GDB でメモリ/変数を調べるにはどうすればよいですか?」
- 「リモートの組み込みターゲットをデバッグするにはどうすればよいですか?」
- 「GDB のフレームが
??と表示される/ソースが表示されません」 - 「バグを決定論的に再現するにはどうすればよいですか?」(記録/再生)
ワークフロー
1. 前提条件:デバッグ情報を付けてコンパイルする
必ず -g を付けてコンパイルします(GCC/Clang)。デバッグしやすいコードの大半では、-Og または -O0 を使用します。
gcc -g -Og -o prog main.c
リリースビルドでは、-g -O2 を使用し、シンボル付きのバイナリを保持します(objcopy で別途ストリップします)。
2. GDB を起動する
gdb ./prog # load binary
gdb ./prog core # load with core dump
gdb -p 12345 # attach to running process
gdb --args ./prog arg1 arg2 # pass arguments
gdb -batch -ex 'run' -ex 'bt' ./prog # non-interactive (CI)
3. 基本コマンド
| コマンド | ショートカット | 効果 |
|---|---|---|
run [args] | r | プログラムを開始します |
continue | c | ブレーク後に再開します |
next | n | ステップオーバーします(ソース行) |
step | s | ステップインします |
nexti | ni | ステップオーバーします(命令) |
stepi | si | ステップインします(命令) |
finish | 現在の関数の末尾まで実行します | |
until N | 行 N まで実行します | |
return [val] | 関数から強制的に戻ります | |
quit | q | GDB を終了します |
4. ブレークポイントとウォッチポイント
break main # break at function
break file.c:42 # break at line
break *0x400abc # break at address
break foo if x > 10 # conditional break
tbreak foo # temporary breakpoint (fires once)
rbreak ^mylib_.* # regex breakpoint on all matching functions
watch x # watchpoint: break when x changes
watch *(int*)0x601060 # watch memory address
rwatch x # break when x is read
awatch x # break on read or write
info breakpoints # list all breakpoints
delete 3 # delete breakpoint 3
disable 3 # disable without deleting
enable 3
5. 状態を調べる
print x # print variable
print/x x # print in hex
print *ptr # dereference pointer
print arr[0]@10 # print 10 elements of array
display x # auto-print x on every stop
undisplay 1
info locals # all local variables
info args # function arguments
info registers # all CPU registers
info registers rip rsp rbp # specific registers
x/10wx 0x7fff0000 # examine 10 words at address
x/s 0x400abc # examine as string
x/i $rip # examine current instruction
backtrace # call stack (bt)
bt full # bt + local vars
frame 2 # switch to frame 2
up / down # move up/down the stack
6. マルチスレッドのデバッグ
info threads # list threads
thread 3 # switch to thread 3
thread apply all bt # backtrace all threads
thread apply all bt full # full bt all threads
set scheduler-locking on # pause other threads while stepping
7. 逆方向デバッグ(記録/再生)
記録には target record-full または target record-btrace(Intel PT)が必要です。
# Software record (slow but universal)
record # start recording
run
# ... trigger the bug ...
reverse-continue # go back to last break
reverse-next # step backwards
reverse-step
reverse-finish
# Intel Processor Trace (fast, hardware)
target record-btrace pt
run
# view instruction history
record instruction-history
8. gdbserver によるリモートデバッグ
ターゲット側:
gdbserver :1234 ./prog
# Or attach:
gdbserver :1234 --attach 5678
ホスト側:
gdb ./prog
(gdb) target remote 192.168.1.10:1234
(gdb) break main
(gdb) continue
クロスコンパイルの場合は、ホストで aarch64-linux-gnu-gdb を使用します。
9. よくある問題
| 症状 | 原因 | 対処法 |
|---|---|---|
No symbol table | バイナリが -g なしでコンパイルされている | -g を付けて再コンパイルします |
バックトレースのフレームが ?? と表示される | デバッグ情報がない、またはスタックが破損している | debuginfo パッケージをインストールします。スタック破壊がないか確認します |
Cannot access memory at address | NULL 参照/解放済みメモリ | 参照解除の前にポインターを確認します。ASan を使用します |
バックトレースに SIGABRT が表示される | abort() またはアサーションの失敗 | フレームを上にたどって、アサーションを探します |
run で GDB が停止する | バイナリが入力を待っている | 標準入力をリダイレクトします:run < /dev/null |
| ブレークポイントの位置がずれる | オプティマイザーがコードを移動した | -Og を付けてコンパイルするか、nexti を使用します |
10. GDB 初期化ファイル(~/.gdbinit)
set history save on
set history size 1000
set print pretty on
set print array on
set print array-indexes on
set pagination off
set confirm off
コマンドチートシートについては、references/cheatsheet.md を参照してください。 プリティプリンターと Python スクリプトについては、references/scripting.md を参照してください。
関連スキル
- コアファイルの読み込みには
skills/debuggers/core-dumpsを使用します - LLDB ベースのワークフローには
skills/debuggers/lldbを使用します - デバッガーが必要になる前にバグを検出するには
skills/runtimes/sanitizersを使用します -gフラグの詳細についてはskills/compilers/gccを使用します
コメント
Markdown 対応