在 Ubuntu 下调试 C++ 程序,常见且推荐的方式是使用 gdb(命令行调试器),配合 gcc/g++ 编译。下面从「编译 → 调试 → 常用技巧」给你一个完整说明。
调试前,必须用 -g 编译,否则看不到变量和行号。
g++ -g -O0 main.cpp -o main
说明:
-g:生成调试信息-O0:关闭优化(避免代码被重排,方便调试)gdb ./main
进入 gdb 后常见操作:
(gdb) run # 运行程序
(gdb) run arg1 arg2 # 带参数运行
break main # 在 main 函数设断点
break main.cpp:10 # 在第10行设断点
break funcName # 在某个函数设断点
查看/删除断点:
info break
delete 1
next # 下一步(不进入函数)
step # 进入函数
continue # 继续执行到下一个断点
finish # 执行完当前函数
print x # 打印变量
print &x # 打印地址
bt # 查看调用栈
frame 1 # 切换到指定栈帧
gdb ./main
run
程序崩溃后:
bt
可以快速定位是哪一行导致崩溃。
ulimit -c unlimited
运行程序崩溃后生成 core 文件。
gdb ./main core
bt
sudo apt install gdb
VS Code 安装:
launch.json{
"version": "0.2.0",
"configurations": [
{
"name": "C++ Debug",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/main",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb"
}
]
}
按 F5 即可断点调试。
valgrind ./main
addr2line -e main 0x4005b6
#include <iostream>
using namespace std;
int main() {
int a = 10;
int b = 0;
cout << a / b << endl; // 故意制造错误
}
g++ -g -O0 test.cpp -o test
gdb ./test
run
bt
如果你愿意,可以告诉我:
我可以给你更针对性的调试方案。