在 Linux 下调试 C++ 程序,常用且高效的方式主要有 gdb、日志、sanitizer、IDE 集成调试 等。下面按常见场景给你一个实用指南。
g++ -g -O0 main.cpp -o main
-g:生成调试信息-O0:关闭优化(否则变量可能被优化掉)gdb ./main
常用命令:
| 命令 | 作用 |
|---|---|
run / r |
运行程序 |
break main |
在 main 函数打断点 |
break test.cpp:10 |
在指定文件行号打断点 |
next / n |
下一行(不进入函数) |
step / s |
进入函数 |
print x / p x |
打印变量 |
backtrace / bt |
查看调用栈 |
continue / c |
继续执行 |
quit / q |
退出 |
示例:
(gdb) break main
(gdb) run
(gdb) next
(gdb) print i
gdb ./main
run
崩溃后:
bt
可以看到崩溃位置。
ulimit -c unlimited
./main
gdb ./main core
bt
比 gdb 更适合找 内存越界、野指针、double free
g++ -fsanitize=address -g main.cpp -o main
./main
✅ 优点:
info threads
thread 2
bt
⚠️ 多线程 + gdb 容易卡,建议:
std::atomic / mutex 约束问题#include <iostream>
#define DEBUG(x) std::cout << #x << " = " << x << std::endl
DEBUG(a);
DEBUG(vec.size());
适合:
VS Code 示例(launch.json):
{
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/main",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"externalConsole": false,
"MIMode": "gdb"
}
✅ 推荐顺序:
-g -O0❌ 优化级别太高(-O2)导致调试困难
❌ 没加 -g
❌ release 版调试 core 文件
❌ 多线程乱用 gdb(容易误判)
如果你愿意,可以告诉我:
我可以给你 针对性的调试方案。