GDB是C++开发中常用的命令行调试工具,通过g++ -g -O0编译生成带调试信息的程序,使用gdb ./myprogram启动后可设置断点、单步执行、打印变量;程序崩溃时用bt查看调用栈,结合frame、info locals等命令定位问题,支持条件断点break 20 if i==5和监视点watch x追踪变量变化。

GDB 是 GNU 调试器,是 C++ 开发中最常用的命令行调试工具。它能帮助你查看程序运行时的状态,比如变量值、函数调用栈、执行流程等,快速定位和修复 bug。下面介绍如何在 C++ 项目中使用 GDB 进行有效调试。
编译程序时启用调试信息
要使用 GDB 调试 C++ 程序,首先必须在编译时加入调试符号。否则 GDB 无法查看变量、源码行等信息。
使用 -g 编译选项生成调试信息:
g++ -g -o myprogram main.cpp
推荐同时关闭优化(-O0),避免编译器优化导致代码执行顺序与源码不符:
立即学习“C++免费学习笔记(深入)”;
g++ -g -O0 -o myprogram main.cpp
启动和基本操作
使用 gdb 命令加载可执行文件:
gdb ./myprogram
进入 GDB 后,常用命令包括:
- run (r):运行程序,可带命令行参数,如 run arg1 arg2
-
break
或 b main:在函数处设断点 -
break
:在指定行号设断点,如 b 15 - list (l):显示源代码,默认显示当前行附近
- next (n):单步执行,不进入函数内部
- step (s):单步执行,遇到函数会进入
- continue (c):继续运行直到下一个断点
- print (p):打印变量值,如 p x
- quit (q):退出 GDB
查看程序状态
调试过程中,了解程序当前状态至关重要。
- backtrace (bt):查看函数调用栈,知道从哪一路调用到了当前位置
- info locals:显示当前作用域内所有局部变量的值
- info args:显示当前函数的参数值
-
frame
:切换到指定栈帧,便于查看不同层级的变量
处理崩溃和信号
如果程序崩溃(如段错误),GDB 会暂停在出错位置。
启动后运行程序,发生段错误时:
- 输入 bt 查看调用栈,找到崩溃源头
- 用 frame 切换栈帧,检查各层变量状态
- 常见问题如空指针解引用、数组越界,在对应代码行结合 print 检查变量即可发现
条件断点与监视点
有时只在特定条件下才需要中断。
- break 20 if i == 5:当变量 i 等于 5 时才触发断点
- watch x:设置监视点,当变量 x 的值被修改时中断(对全局或局部变量都有效)
- watch 支持条件:watch x if x
小技巧与建议
- 使用 directory 命令添加源码路径,方便查看分离的源文件
- 写一个 .gdbinit 文件存放常用设置或命令别名
- 配合 make 使用:直接在 Makefile 中保留 -g 选项,便于随时调试
- 对于多线程程序,使用 info threads 和 thread
切换线程调试
基本上就这些。GDB 功能强大,但掌握核心命令就能解决大多数调试问题。熟练之后,你会发现比打印日志高效得多。









