在 Linux 下进行 C++ 调试,最常用、最成熟的方案是 GDB(GNU Debugger),配合 gcc/g++ 和 core dump、Valgrind、sanitizers 等工具。下面按使用场景给你一个系统性的说明。
g++ -g -O0 main.cpp -o main
参数说明:
-g:生成调试信息(必须)-O0:关闭优化(否则变量可能被优化掉)✅ 调试一定要加 -g
gdb ./main
或:
gdb --args ./main arg1 arg2
| 功能 | 命令 |
|---|---|
| 运行程序 | run / r |
| 设置断点 | break main.cpp:10 |
| 查看断点 | info break |
| 单步执行 | next / n |
| 进入函数 | step / s |
| 继续执行 | continue / c |
| 打印变量 | print x |
| 查看堆栈 | bt |
| 查看当前代码 | list |
| 修改变量 | set var x=10 |
| 退出 | quit |
gdb ./main
(gdb) break main
(gdb) run
(gdb) next
(gdb) print i
(gdb) bt
ulimit -c unlimited
运行程序,崩溃后会生成:
core 或 core.<pid>
gdb ./main core
然后:
bt
✅ 可直接看到 崩溃位置
sudo apt install valgrind
valgrind --tool=memcheck ./main
✅ 可发现:
g++ -fsanitize=address -g main.cpp -o main
./main
✅ 能精准定位:
g++ -fsanitize=undefined -g main.cpp -o main
g++ -fsanitize=thread -g main.cpp -o main
launch.json✅ 本质还是调用 GDB
✅ 调试顺序建议
-ggdb 单步跟踪core + gdbasan / valgrindtsan| 问题 | 原因 |
|---|---|
| 变量看不到 | 忘记 -g 或开了 -O2 |
| bt 看不到栈 | 优化过度 |
| core 文件没生成 | ulimit -c 没开 |
如果你愿意,可以告诉我:
我可以给你 针对你项目的调试方案。