如何在Ubuntu上进行C++调试
在Ubuntu上进行C++调试,可通过**命令行工具(GDB)或图形化工具(如Visual Studio Code、CLion)**实现。以下是详细步骤及实用技巧:
调试前需安装GDB(GNU调试器)——Linux下最核心的C++调试工具。打开终端,执行以下命令:
sudo apt update && sudo apt install gdb
安装完成后,通过gdb --version验证是否成功(显示版本信息即为成功)。
要让调试工具识别源代码(如变量名、行号),必须使用-g选项编译C++程序。例如:
g++ -g -o my_program my_program.cpp
关键选项说明:
-g:嵌入调试信息(必须);-O0:关闭编译器优化(避免优化导致代码逻辑与源码不符,建议调试时添加);-Wall:开启所有警告(帮助发现潜在问题)。在终端输入以下命令,加载可执行文件:
gdb ./my_program
启动后,终端会进入GDB交互界面(提示符为(gdb))。
break main # 在main函数开头设置断点
break my_program.cpp:42 # 在my_program.cpp的第42行设置断点
run # 简写为`r`
next(简写n):执行下一行代码,不进入函数内部;step(简写s):执行下一行代码,进入函数内部(用于跟踪函数逻辑)。print variable_name # 简写为`p variable_name`(如`p i`查看变量i的值)
backtrace # 简写为`bt`
continue # 简写为`c`
quit # 简写为`q`
VS Code是轻量且功能强大的编辑器,通过安装扩展可实现直观的C++调试。
Ctrl+Shift+X),搜索并安装**C/C++**扩展(由Microsoft发布)。在项目根目录下创建.vscode文件夹,并添加两个配置文件:
{
"version": "2.0.0",
"tasks": [
{
"label": "build",
"type": "shell",
"command": "g++",
"args": [
"-g",
"-O0",
"-Wall",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
"group": {
"kind": "build",
"isDefault": true
}
}
]
}
{
"version": "0.2.0",
"configurations": [
{
"name": "C++ 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"
}
]
}
说明:preLaunchTask指定编译任务(即tasks.json中的"label"),确保调试前自动编译。my_program.cpp);F5键或点击顶部工具栏的绿色调试箭头,启动调试会话;valgrind --leak-check=full ./my_program
输出结果会显示内存泄漏的位置及大小。strace ./my_program
-fsanitize=address选项:g++ -g -fsanitize=address -O0 -o my_program my_program.cpp
运行程序时,AddressSanitizer会在终端输出错误信息(如内存越界)。backtrace查看调用栈,定位崩溃发生的函数;watch variable_name命令,当变量值改变时暂停程序(有助于发现变量被意外修改的问题);-O0选项,防止编译器优化导致代码逻辑与源码不符(如循环变量被优化掉);assert(condition),当条件不满足时终止程序(帮助快速发现问题,调试完成后可通过-DNDEBUG宏禁用断言)。