C++如何使用GDB调试程序?(入门命令指南)

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
  • runr —— 开始运行(支持传参:r arg1 "arg two"
  • kill —— 终止当前运行中的程序
  • quitq —— 退出 GDB

打断点、单步、查状态

这是日常调试最频繁的操作:

  • break mainb main —— 在 main 函数开头下断点
  • break file.cpp:15 —— 在指定文件第 15 行打断点
  • break ClassName::funcName —— 对 C++ 成员函数下断点(注意作用域)
  • nextn —— 下一行(不进入函数内部)
  • steps —— 进入函数内部(遇到函数调用就跳进去)
  • print xp x —— 打印变量 x 的值(支持 p *ptrp vec[0] 等)
  • info registers —— 查寄存器(底层调试用);info threads —— 查线程

查看调用栈与崩溃现场

程序崩了?别急着重跑,先看它在哪挂的:

  • 崩溃后自动停在 fault 点,直接输 bt(backtrace)—— 显示完整调用栈
  • bt full —— 不仅显示函数,还打印每层的局部变量值
  • frame 2 —— 切换到栈帧 #2,再用 listp 查上下文
  • listl —— 显示当前行附近源码(可跟行号:l 20

基本上就这些。不用记全命令,先熟记 g 编译、b/r/n/s/p/bt 这几个,调试流程就通了。不复杂但容易忽略 -g。