使用GDB调试C++需先编译时加-g选项,再用gdb启动程序,设置断点、单步执行、查看变量和调用栈,结合信号处理与附加进程等技巧可高效定位段错误、逻辑错误和内存问题。

使用 GDB 调试 C++ 程序是开发中非常实用的技能,能帮助你定位段错误、逻辑错误和内存问题。以下是常用方法与命令,适合实际开发场景。
编译程序时加入调试信息
要使用 GDB 调试,必须在编译时添加 -g 选项,保留调试符号:
g++ -g -o myprogram myprogram.cpp这样生成的可执行文件才能被 GDB 正确识别变量名、函数名和行号。
启动 GDB 并运行程序
进入调试环境:
立即学习“C++免费学习笔记(深入)”;
gdb ./myprogram进入 GDB 后,输入 run(或简写 r)启动程序:
(gdb) run也可以传递命令行参数:
(gdb) run arg1 arg2设置断点
断点是调试的核心。常见设置方式:
-
按行号设断点:
(gdb) break 15 -
按函数名设断点:
(gdb) break main
(gdb) break MyClass::func -
查看所有断点:
(gdb) info breakpoints -
删除断点:
(gdb) delete 1(删除编号为1的断点)
单步执行与控制流程
程序暂停后,可用以下命令逐步执行:
- next (n):执行下一行(不进入函数)
- step (s):进入函数内部
- continue (c):继续运行直到下一个断点
- finish:跳出当前函数
- until:跳出循环或执行到指定行
查看变量和表达式
调试过程中可以实时查看数据:
-
print 变量名:
(gdb) print x
(gdb) print this->value -
display 表达式:每次暂停时自动显示该值
(gdb) display count -
ptype 变量:查看变量类型
(gdb) ptype myobj
检查调用栈
当程序崩溃或中断时,查看函数调用路径:
- backtrace (bt):显示完整调用栈
- frame n:切换到第 n 层栈帧
- up / down:在栈帧间上下移动
例如,看到段错误时,用 bt 可快速定位出问题的函数和行号。
处理信号和异常
C++ 程序崩溃通常由 SIGSEGV 等信号触发。GDB 默认会暂停这类信号:
- 查看信号处理方式:
(gdb) info signals - 让程序接收到信号时不中断:
(gdb) handle SIGPIPE nostop noprint
附加到正在运行的进程
如果程序已运行,可以用 GDB 挂载调试:
gdb ./myprogram 1234其中 1234 是进程 PID。也可先启动 GDB 再附加:
(gdb) attach 1234调试完用 detach 脱离进程。
实用技巧
- 使用 list 显示源码:
(gdb) list 10,20 显示第10到20行 - 设置条件断点:
(gdb) break 15 if i==10 - 保存调试命令到脚本:
写入 .gdbinit 文件自动加载配置 - 结合 valgrind 使用,排查内存泄漏










