mcpField
G
gdb

gdb

github.com/mohitmishra786開発269956 回インストール18 週間前に更新
リポジトリ

gdb について

エージェント向けの GDB 実践ガイドです。基本操作からクラッシュ解析、リバースデバッグ、リモートデバッグ、マルチスレッドの調査まで扱い、よくある問題の対処法も示します。

主な機能

  1. 01GDBセッションの開始と操作
  2. 02条件付きブレークポイントとウォッチポイント
  3. 03変数、メモリ、スレッドの調査
  4. 04実行の記録とリプレイ
  5. 05gdbserverによるリモート接続
  6. 06シンボルやバックトレースの問題解決

活用シーン

  1. 01コアダンプやバックトレースによるクラッシュ調査
  2. 02変数が条件を満たした時点での停止
  3. 03マルチスレッドプログラムの状態確認
  4. 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プログラムを開始します
continuecブレーク後に再開します
nextnステップオーバーします(ソース行)
stepsステップインします
nextiniステップオーバーします(命令)
stepisiステップインします(命令)
finish現在の関数の末尾まで実行します
until N行 N まで実行します
return [val]関数から強制的に戻ります
quitqGDB を終了します
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 addressNULL 参照/解放済みメモリ参照解除の前にポインターを確認します。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 を使用します

コメント