GDB调试C++程序核心是三步:编译时加-g、启动GDB、用断点和单步控制执行;不加-g则无法查看变量或源码,必须用g++ -g或CMake设置Debug模式,再通过b/r/n/s/p/bt等命令调试。

用GDB调试C++程序,核心是三步:编译时加-g、启动GDB、用断点和单步控制执行。不加调试信息,GDB几乎没法看变量或源码。
编译时必须带 -g 选项
GDB依赖调试符号,而默认编译(如 g++ main.cpp -o app)会剥离这些信息。正确做法是:
-
g++ -g -o app main.cpp—— 最基础,启用完整调试信息 -
g++ -g3 -O0 -o app main.cpp——-g3包含宏定义,-O0关闭优化(避免代码重排导致单步跳变) - 如果用了 CMake,在
CMakeLists.txt中设set(CMAKE_BUILD_TYPE Debug),它会自动加-g
常用 GDB 启动与运行命令
启动后先加载程序,再决定怎么跑:
-
gdb ./app—— 直接加载可执行文件 -
gdb ./app core—— 加载崩溃生成的 core 文件(需先ulimit -c unlimited) -
run或r—— 开始运行(支持传参:r arg1 "arg two") -
kill—— 终止当前运行中的程序 -
quit或q—— 退出 GDB
打断点、单步、查状态
这是日常调试最频繁的操作:
立即学习“C++免费学习笔记(深入)”;
-
break main或b main—— 在 main 函数开头下断点 -
break file.cpp:15—— 在指定文件第 15 行打断点 -
break ClassName::funcName—— 对 C++ 成员函数下断点(注意作用域) -
next或n—— 下一行(不进入函数内部) -
step或s—— 进入函数内部(遇到函数调用就跳进去) -
print x或p x—— 打印变量 x 的值(支持p *ptr、p vec[0]等) -
info registers—— 查寄存器(底层调试用);info threads—— 查线程
查看调用栈与崩溃现场
程序崩了?别急着重跑,先看它在哪挂的:
- 崩溃后自动停在 fault 点,直接输
bt(backtrace)—— 显示完整调用栈 -
bt full—— 不仅显示函数,还打印每层的局部变量值 -
frame 2—— 切换到栈帧 #2,再用list或p查上下文 -
list或l—— 显示当前行附近源码(可跟行号:l 20)
基本上就这些。不用记全命令,先熟记 g 编译、b/r/n/s/p/bt 这几个,调试流程就通了。不复杂但容易忽略 -g。










