在 Linux 下用 C++ 调试程序,通常分为编译配置、调试工具使用和常见问题定位三部分。下面给你一套实用流程。
一定要加 -g,否则无法调试:
g++ -g -O0 main.cpp -o app
说明:
-g:生成调试符号-O0:关闭优化(避免变量被优化掉,调试更直观)-g(可 strip 去掉符号)set(CMAKE_BUILD_TYPE Debug)
set(CMAKE_CXX_FLAGS_DEBUG "-g -O0")
或命令行:
cmake -DCMAKE_BUILD_TYPE=Debug ..
gdb ./app
或调试正在运行的程序:
gdb -p <pid>
run # 运行程序
break main.cpp:10 # 在指定行打断点
break funcName # 函数断点
next # 单步(不进函数)
step # 单步(进函数)
print x # 打印变量
backtrace # 查看调用栈
continue # 继续执行
watch x # 监视变量变化
quit # 退出
gdb ./app core
bt
(需开启 core dump)
ulimit -c unlimited
运行程序后若崩溃:
gdb ./app core
bt
cgdb ./app
launch.json 示例:{
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/app",
"MIMode": "gdb"
}
valgrind --leak-check=full ./app
编译:
g++ -g -O1 -fsanitize=address main.cpp -o app
运行:
./app
可检测:
info threads
thread 2
bt
thread apply all bt-O0如果你愿意,可以告诉我:
我可以直接给你一份可复用的调试配置模板。