
用GDB调试C++程序,核心是“编译带调试信息 + 启动GDB + 控制执行 + 查看状态”。只要掌握几个关键命令,就能快速定位变量值、函数调用和崩溃位置。
编译时必须加 -g 参数
没有调试信息,GDB只能看到汇编,看不到变量名和源码行。务必使用:
如果用了 CMake,确保设置:set(CMAKE_BUILD_TYPE Debug) 或在命令行加 -DCMAKE_BUILD_TYPE=Debug。
启动与基本运行控制
启动后先加载程序,再决定如何跑:
立即学习“C++免费学习笔记(深入)”;
- gdb ./myapp —— 启动GDB并载入可执行文件
- run 或 r —— 开始运行(可跟参数:r arg1 "arg two")
- kill —— 终止当前运行的程序
- quit 或 q —— 退出GDB
打断点、单步与继续执行
断点是调试的起点,灵活组合才能高效排查:
- break main —— 在 main 函数入口设断点
- break foo.cpp:25 —— 在 foo.cpp 第25行设断点
- break ClassName::methodName —— 对类成员函数设断点(注意命名空间或模板需完整写法)
- continue 或 c —— 从当前断点继续运行到下一个断点
- next 或 n —— 下一行(不进入函数内部)
- step 或 s —— 进入函数内部(遇到函数调用就跳进去)
- finish —— 执行完当前函数,停在它的返回处
查看变量、栈帧与内存
运行暂停后,重点就是“看”:
- print x 或 p x —— 打印变量 x 的值(支持表达式:p *ptr、p vec[0])
- print /x i —— 以十六进制打印 i;/t 是二进制,/f 是浮点
- info locals —— 显示当前栈帧所有局部变量
- bt 或 backtrace —— 查看完整调用栈(崩溃时第一要输的命令)
- 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 可随时中断正在运行的程序,停在当前执行点,方便检查状态










