GDB(GNU Debugger)是Linux环境下强大的调试工具,掌握以下技巧能帮你快速定位BUG:
1. 核心调试流程
gcc -g main.c -o demo # 编译时添加 -g 生成调试信息
gdb ./demo # 启动GDB
(gdb) run # 运行程序
(gdb) bt # 崩溃时查看调用栈(backtrace)
2. 关键命令速查
| 命令 | 作用 | 示例 |
|---------------|-----------------------------|-------------------------|
| break
| 设置断点 | break main.c:20
|
| next
(n) | 单步执行(不进入函数) | next
|
| step
(s) | 单步执行(进入函数) | step
|
| print
(p) | 打印变量值 | print *ptr
|
| info locals
| 查看当前栈帧所有局部变量 | info locals
|
| watch
| 监控变量变化(触发断点) | watch var_name
|
| x
| 检查内存内容 | x/10xw &array
|
3. 高效调试技巧
3.1 条件断点
(gdb) break foo.c:42 if i == 100 # 仅当i=100时触发断点
3.2 崩溃现场分析
(gdb) bt full # 查看完整调用栈及局部变量
(gdb) info reg # 检查寄存器值(尤其关注ebp/eip)
(gdb) x/20i $eip # 反汇编崩溃点附近指令
3.3 多线程调试
(gdb) info threads # 查看所有线程
(gdb) thread 2 # 切换到线程2
(gdb) break thr_func thread 3 # 仅在线程3的thr_func设断点
3.4 自动化调试
# 将命令写入gdb_script.txt:
# break main
# run
# backtrace
gdb -x gdb_script.txt ./demo
4. 实战场景
4.1 段错误(Segmentation Fault)
(gdb) run # 触发段错误
(gdb) bt # 查看崩溃位置
(gdb) p *pointer # 检查是否解引用空指针
4.2 内存泄漏检查(结合Valgrind)
valgrind --leak-check=full ./demo # 先用Valgrind定位泄漏
(gdb) break malloc/mfree # 在分配/释放处设断点
4.3 死锁问题
(gdb) info threads # 查看线程状态
(gdb) thread apply all bt # 打印所有线程堆栈
# 重点检查锁的获取顺序是否成环
5. 高级技巧
- 反向调试:使用
record
和reverse-step
回溯执行过程(需支持反向执行的GDB版本)。 - Python扩展:通过GDB的Python API编写自定义调试脚本(如自动化分析数据结构)。
- 核心转储分析:
gdb ./demo core.1234
直接调试崩溃后的core文件。
6. 注意事项
- 编译时务必加
-g
选项保留调试符号。 - 优化会影响调试准确性(如
-O2
可能改变变量位置),建议调试时用-O0
。 - 使用
-tui
参数启动GDB可获得分屏源码视图。
掌握这些技巧后,大部分BUG都能在10分钟内定位到根本原因。遇到复杂问题时可结合 strace
、perf
等工具进一步分析。
// 来源:https://www.nzw6.com