Ubuntu C++调试程序错误的常用方法
GDB是Ubuntu下调试C++程序的经典命令行工具,需配合编译时的-g选项使用,以下是详细步骤:
若未安装,通过终端执行以下命令安装:
sudo apt update && sudo apt install gdb
使用g++编译时添加-g参数,保留程序的调试符号(关键步骤,否则GDB无法定位源代码):
g++ -g -o my_program my_program.cpp
(-g选项会将源代码、变量名、行号等信息嵌入可执行文件)
终端输入以下命令启动GDB并加载编译后的程序:
gdb ./my_program
main)处设置断点:break mainmy_program.cpp)的某一行(如第42行)设置断点:break my_program.cpp:42run(可附加命令行参数,如run arg1 arg2)next(或n):执行下一行代码,不进入函数内部(适合快速跳过库函数)。step(或s):执行下一行代码,进入函数内部(适合调试自定义函数)。print variable_name(如print x)。print x + y(支持算术、逻辑表达式)。backtrace(或bt):显示当前调用栈的所有帧(frame)。frame 3:切换到调用栈的第3帧,查看该函数的局部变量。continue(或c)。quit(或q)。假设有以下简单程序(my_program.cpp),用于演示GDB调试:
#include <iostream>
void divide(int a, int b) {
int result = a / b; // 可能触发除零错误
std::cout << "Result: " << result << std::endl;
}
int main() {
int x = 10, y = 0;
divide(x, y); // 调用可能出错的函数
return 0;
}
调试步骤:
g++ -g -o my_program my_program.cppgdb ./my_programdivide函数入口设置断点:break dividerundivide函数处暂停,查看变量b的值(print b),发现b=0(导致除零错误)。quitVS Code是图形化IDE,通过安装扩展和配置文件,可提供更直观的调试体验:
在项目根目录下创建.vscode文件夹(若不存在),并添加以下两个配置文件:
{
"version": "2.0.0",
"tasks": [
{
"label": "build",
"type": "shell",
"command": "g++",
"args": [
"-g", // 必须添加,生成调试信息
"${file}", // 当前打开的文件
"-o", // 输出文件名
"${fileDirname}/${fileBasenameNoExtension}"
],
"group": {
"kind": "build",
"isDefault": true
}
}
]
}
{
"version": "0.2.0",
"configurations": [
{
"name": "g++ debug",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}", // 可执行文件路径
"args": [], // 程序参数(可选)
"stopAtEntry": false,
"cwd": "${workspaceFolder}", // 工作目录
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "build" // 调试前执行的任务(对应tasks.json中的"label")
}
]
}
my_program.cpp)。Ctrl+Shift+B(Windows/Linux)或Cmd+Shift+B(Mac),编译程序(执行tasks.json中的任务)。F5键,启动调试会话(VS Code会自动加载launch.json配置,编译并启动GDB)。next命令。step命令。break命令)。除GDB和VS Code外,以下工具可辅助定位特定类型的错误:
valgrind --leak-check=full ./my_program(--leak-check=full显示详细的内存泄漏信息)。strace ./my_program(显示程序执行的所有系统调用)。-DNDEBUG禁用)。assert(ptr != nullptr);(若ptr为nullptr,程序终止并输出错误信息)。