GDB 调试
一、基础用法
1. 启动
gdb ./app # 调试可执行
gdb ./app core # 调试 core dump
gdb --pid 1234 # attach 到运行中进程
gdb --args ./app arg1 arg2 # 带参数启动
2. 常用命令
break main # 断点到 main
break file.c:line # 源文件断点
break func # 函数入口断点
break *0x40000000 # 地址断点(汇编级)
break foo if x == 5 # 条件断点
run # 运行
next / step / finish # 下一步 / 进入函数 / 执行完当前函数
continue # 继续
until line # 跳出循环
info registers # 查看寄存器
info locals # 局部变量
info args # 函数参数
info threads # 线程
info breakpoints # 断点
print x # 打印变量
print *p # 解引用
print/x x # 十六进制
print *(int*)p # 强转
display x # 每步都打印
whatis x # 类型
ptype x # 详细类型
backtrace / bt # 调用栈
frame N # 切换栈帧
up / down
list # 显示源码
list func
list file.c:1,20
set var x = 10 # 改值
call foo() # 调函数
disassemble # 反汇编当前函数
disassemble main
watch x # 数据断点(写)
rwatch x # 读断点
3. 初始化文件 ~/.gdbinit
set print pretty on
set pagination off
set disassembly-flavor intel
define hook-run
set print pretty on
end
二、Core Dump 分析
1. 启用
ulimit -c unlimited # 当前 shell
echo '/tmp/core.%e.%p' | sudo tee /proc/sys/kernel/core_pattern
2. 调试
gdb ./app /tmp/core.app.1234
(gdb) bt # 看崩溃栈
(gdb) frame 3
(gdb) info locals
(gdb) list
3. 内核转储(kdump)
- 内核崩溃后用 kexec 启动第二个内核
- /var/crash/ 保存 vmlinux 和 vmcore
crash 工具分析
三、远程调试
1. gdbserver(嵌入式推荐)
# 目标板
gdbserver :2345 ./app
gdbserver --attach :2345 PID
# 主机
gdb
(gdb) target remote 192.168.1.100:2345
(gdb) set sysroot /opt/sysroot-arm
(gdb) set solib-search-path /opt/sysroot-arm/usr/lib
(gdb) b main
(gdb) continue
2. kgdb(内核调试)
- 内核配置:
CONFIG_KGDB=y、CONFIG_KGDB_SERIAL_CONSOLE=y
- 通过串口连接主机 gdb
- 见
Documentation/dev-tools/kgdb.rst
3. OpenOCD + JTAG
openocd -f board/stm32mp1.cfg
- gdb
target remote localhost:3333
- 可调试 bootloader、内核
四、多线程调试
info threads # 列出线程
thread 3 # 切换
thread apply all bt # 全部线程栈
set scheduler-locking on # 只跑当前线程
set print thread-events on # 线程切换时打印
五、TUI 模式
gdb -tui ./app
# 进入 TUI 后:
# Ctrl+X A:源码 / 汇编切换
# Ctrl+X O:窗口切换
# Ctrl+X 2:双窗口
六、常用插件 / 增强
- gdb-dashboard:终端下的可视化面板
- gef / peda / pwndbg:漏洞分析神器
- VSCode C/C++ 扩展:图形化 GDB 前端
七、踩坑清单
| 问题 |
解决 |
| 看不到源码 |
编译时加 -g 且不要 strip |
| 看不到共享库符号 |
set sysroot / set solib-search-path |
| 优化后变量看不见 |
-O0 或 -Og |
| 内核调试卡死 |
检查 kgdb 配置、串口线 |