C++如何使用GDB进行调试?(常用命令教程)

15次阅读

c++kquote>GDB调试c++程序的核心是“编译带调试信息+启动GDB+控制执行+查看状态”:需用-g或-g3 -O0编译,gdb ./app启动后设断点(break)、单步(n/s)、查(bt)、打印变量(p)及内存(x)。

C++如何使用GDB进行调试?(常用命令教程)

用GDB调试C++程序,核心是“编译带调试信息 + 启动GDB + 控制执行 + 查看状态”。只要掌握几个关键命令,就能快速定位变量值、函数调用和崩溃位置。

编译时必须加 -g 参数

没有调试信息,GDB只能看到汇编,看不到变量名和源码行。务必使用:

  • g++ -g -o myapp main.cpp(基础调试版)
  • g++ -g3 -O0 -o myapp main.cpp(推荐:-g3保留宏信息,-O0禁用优化,避免变量被优化掉或行号错乱)

如果用了 CMake,确保设置:set(CMAKE_BUILD_TYPE Debug) 或在命令行加 -DCMAKE_BUILD_TYPE=Debug

启动与基本运行控制

启动后先加载程序,再决定如何跑:

立即学习C++免费学习笔记(深入)”;

  • gdb ./myapp —— 启动GDB并载入可执行文件
  • runr —— 开始运行(可跟参数:r arg1 “arg two”
  • kill —— 终止当前运行的程序
  • quitq —— 退出GDB

打断点、单步与继续执行

断点是调试的起点,灵活组合才能高效排查:

  • break main —— 在 main 函数入口设断点
  • break foo.cpp:25 —— 在 foo.cpp 第25行设断点
  • break ClassName::methodName —— 对类成员函数设断点(注意命名空间或模板需完整写法)
  • continuec —— 从当前断点继续运行到下一个断点
  • nextn —— 下一行(不进入函数内部)
  • steps —— 进入函数内部(遇到函数调用就跳进去)
  • finish —— 执行完当前函数,停在它的返回处

查看变量、帧与内存

运行暂停后,重点就是“看”:

  • print xp x —— 打印变量 x 的值(支持表达式:p *ptrp vec[0]
  • print /x i —— 以十六进制打印 i;/t 是二进制,/f 是浮点
  • info locals —— 显示当前栈帧所有局部变量
  • btbacktrace —— 查看完整调用栈(崩溃时第一要输的命令)
  • frame 2 —— 切换到第2层栈帧,再用 info locals 看那里的变量
  • x/4dw &i —— 查看 i 地址开始的4个有符号整数(x = examine,常用 x/10xb ptr 查内存字节

实用技巧与避坑提醒

真实调试中这些细节常决定成败:

  • 线程程序加 set follow-fork-mode child,让 GDB 跟进子进程
  • 段错误崩溃后,直接输 bt,90% 能看到空指针解引用或越界位置
  • 变量显示为 ?说明没加 -O0 或忘了 -g
  • 想看 STL 容器内容?安装 python 自定义脚本(如 libstdc++ pretty printers),否则 vector 只显示地址
  • Ctrl+C 可随时中断正在运行的程序,停在当前执行点,方便检查状态

text=ZqhQzanResources