关于 gdb
这是一份面向 Agent 的 GDB 实用指南,涵盖从基础调试到崩溃分析、反向调试、远程目标和多线程检查,并提供常见问题排查方法。
主要功能
- 01启动和控制 GDB 会话
- 02设置条件断点和观察点
- 03检查变量、内存和线程
- 04记录并回放程序执行
- 05通过 gdbserver 连接远程目标
- 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
用途
引导 Agent 完成从首次启动到高级工作流的 GDB 调试:崩溃诊断、反向调试、远程调试和多线程检查。
触发场景
- “我的程序段错误/崩溃了——该如何调试?”
- “如何在满足条件 X 时设置断点?”
- “如何在 GDB 中检查内存/变量?”
- “如何调试远程嵌入式目标?”
- “GDB 显示
??栈帧/没有源代码” - “如何确定性地重放错误?”(record/replay)
工作流
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. 反向调试(record/replay)
录制需要 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 | 空指针解引用/访问已释放的内存 | 解引用前检查指针;使用 ASan |
回溯中出现 SIGABRT | 调用了 abort() 或断言失败 | 向上查看栈帧,找到触发的断言 |
GDB 在 run 时挂起 | 二进制正在等待输入 | 重定向标准输入: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。 有关 pretty-printer 和 Python 脚本编写,请参阅 references/scripting.md。
相关技能
- 加载 core 文件时使用
skills/debuggers/core-dumps - 使用基于 LLDB 的工作流时使用
skills/debuggers/lldb - 在需要调试器之前捕获错误时使用
skills/runtimes/sanitizers - 了解
-g标志详情时使用skills/compilers/gcc
评论
支持 Markdown