使用GDB调试程序的完整指南
GDB调试命令终极指南:从基础到进阶
一、源码查看与分屏模式
查看源码片段
•list [行号/函数名]
(简写l
)显示指定位置的代码片段,默认每次展示10行。例如:(gdb) l main.c:20 # 显示main.c第20行附近的代码 (gdb) l my_func # 查看my_func函数的源码
• 分屏模式:通过
cgdb
工具或gdb -tui
命令启动分屏界面,上方显示源码,下方为调试命令窗口。按Esc
切换代码屏,i
返回调试屏。
或输入以下命令
layout src #以图形化窗口打开源码
ctrl+x A #关闭图形化窗口
- 源码路径指定
若项目源码分散在多目录,使用directory <路径>
添加搜索路径,show directories
查看当前路径列表。
二、断点管理
设置断点
• 基础断点:(gdb) b 30 # 第30行设置断点 (gdb) b my_func # 函数入口断点 (gdb) b *0x400504 # 内存地址断点
• 条件断点:
break 45 if i==100
,当变量i
为100时触发。
• 观察点:watch var
监控变量值变化,rwatch var
监控变量被读取。- 断点操作
•info break
查看所有断点,delete <编号>
删除断点。
•disable/enable <编号>
临时禁用/启用断点。
三、程序执行控制
运行与继续
•run
(简写r
)启动程序,continue
(c
)继续执行至下一断点。
• 单步执行:(gdb) next # 逐过程(不进入函数) (gdb) step # 逐语句(进入函数) (gdb) finish # 执行完当前函数并返回 (gdb) until 100 # 运行至第100行(跳出循环常用)
- 跳转与强制返回
•jump 50
跳转到第50行继续执行。
•return <值>
强制从当前函数返回指定值。
四、变量追踪与内存分析
查看变量
•print var
(p
)显示变量值,ptype var
查看类型。
• 格式化输出:(gdb) p/x var # 十六进制显示 (gdb) p/d array@10 # 显示数组前10个元素
- 持续追踪
•display var
每次暂停时自动显示变量。
•x/<格式> <地址>
查看内存,如x/20xw 0x7fffffffe000
显示20个4字节十六进制值。
五、堆栈分析
- 调用栈查看
•backtrace
(bt
)显示完整调用栈,frame <编号>
切换栈帧。
•info frame
查看当前栈帧的寄存器、局部变量等信息。 - 栈破坏调试
结合info registers
检查寄存器值,x
命令分析内存是否越界。
六、多线程调试
线程管理
•info threads
显示所有线程,thread <ID>
切换调试线程。
• 线程锁定:(gdb) set scheduler-locking on # 仅当前线程运行 (gdb) set scheduler-locking step # 单步时锁定其他线程
- 死锁排查
• 使用info mutex
查看锁状态,在锁操作处设置条件断点。
• 示例:break pthread_mutex_lock if mutex_id==0x1234
。
七、大型项目调试技巧
附加到运行进程
gdb attach <PID> # 附加到正在运行的进程 gdb -p <PID> # 直接调试目标进程
- Core Dump分析
• 生成Core文件:ulimit -c unlimited
。
• 加载分析:gdb program core
,结合bt
和info registers
定位崩溃点。 - 宏调试
编译时添加-g3
选项,info macro MACRO_NAME
查看宏定义。
八、高级命令速查表
场景 | 命令示例 |
---|---|
条件断点 | b 50 if i>100 |
监控指针解引用 | watch *(int*)0x7fffffffe3cc |
多线程断点 | b func thread all |
批量执行命令 | thread apply all bt |
查看优化后变量 | set print frame-arguments all |
通过上述命令组合,可高效应对C/C++项目的复杂调试场景。建议结合gdb -batch -x commands.gdb
编写自动化调试脚本,提升效率。