GDB调试C++核心是停程序、查状态、逐步推进;需编译加-g,用b/r/n/s/p/bt等命令覆盖90%需求,避免-O2干扰,善用条件断点和watch定位问题。

用 GDB 调试 C++ 代码,核心是“让程序停下来、看清状态、逐步推进”。新手不必记全命令,掌握几个关键操作就能定位绝大多数逻辑和崩溃问题。
编译时必须加 -g 参数
这是调试的前提。没有调试信息,GDB 看不到变量名、行号、函数名,只能看汇编。正确写法:
- g++ -g -o myapp main.cpp utils.cpp(推荐)
- 不要用 g++ -O2 -g:优化会打乱代码执行顺序,导致单步跳转异常、变量显示为
- 如需兼顾调试与部分性能,可用 -O1 -g,但新手建议全程用 -g 不加优化
启动和运行:run、break、start
进入调试最常用三步:
- gdb ./myapp:加载可执行文件(不运行)
- break main 或 b main:在 main 函数开头设断点
- run 或 r:开始运行,停在第一个断点处
- 快捷方式:gdb ./myapp -ex "b main" -ex "r",一键启动并断在 main
单步执行与查看:next、step、print、info
停住后,重点看清“现在在哪、变量啥值、调用链如何”:
立即学习“C++免费学习笔记(深入)”;
- next(n):逐行执行,遇到函数不进入(适合跳过标准库或已验证函数)
- step(s):逐行执行,遇到函数就进入(适合深入自己写的函数)
- print 变量名 或 p 变量名:查看变量当前值(支持 p i、p vec[0]、p ptr->data)
- info locals:列出当前栈帧所有局部变量及值
- bt(backtrace):崩溃后立刻用,显示完整调用栈,快速定位出问题的函数和行号
实用技巧:条件断点、监视变量、继续执行
解决真实场景中的高频问题:
- break main.cpp:25 if i == 10:只在第 25 行且 i 等于 10 时中断,避免循环中反复打断
- watch 变量名:当该变量被修改时自动中断(比如发现某个 int 被意外改写)
- continue(c):从当前断点继续运行,直到下一个断点或程序结束
- delete 1 或 clear main.cpp:15:删除指定编号或位置的断点,避免干扰
- list 或 l:显示当前附近源码(默认 10 行),配合 step/n 更直观
调试不是猜,而是控制 + 观察。从加 -g 开始,用 b/r/n/s/p/bt 这六七个命令,就能覆盖 90% 的日常调试需求。熟练之后再学信号处理、多线程调试或 core dump 分析也不迟。










