在Debian系统中,调试C++需要编译器(带调试支持)和调试器。通过以下命令安装build-essential(包含g++编译器)和gdb调试器:
sudo apt update sudo apt install build-essential gdb 使用g++编译时,必须添加-g选项,以在可执行文件中嵌入调试符号(包含源代码、变量名、函数名等信息)。例如,对于main.cpp:
g++ -g -o my_program main.cpp 注意:调试时不要使用-O2/-O3优化选项(优化会改变代码执行顺序,导致调试信息与源代码不一致)。
通过以下命令启动GDB并加载可执行文件:
gdb ./my_program 启动后,GDB会显示程序的基本信息(如入口点、编译时间等)。
main函数处设置断点:break mainmain.cpp)的第10行设置断点:break main.cpp:10run./my_program arg1 arg2):run arg1 arg2next(或n):执行下一行代码,不进入函数内部(如调用std::cout时直接跳过)。step(或s):执行下一行代码,进入函数内部(如调用自定义函数时会进入函数体)。print variable_name(或p variable_name):打印变量的当前值(如print x)。info locals:显示当前作用域的所有局部变量及其值。backtrace(或bt):显示函数调用栈(用于追踪程序执行路径,尤其在崩溃时定位问题)。continue(或c):继续执行程序,直到遇到下一个断点或程序结束。quit(或q)。假设有以下main.cpp程序(计算两数之和并输出):
#include <iostream> using namespace std; int main() { int a = 10; int b = 20; int c = a + b; cout << "The sum is " << c << endl; return 0; } 调试步骤:
g++ -g -o my_program main.cppgdb ./my_programbreak mainrunnext(跳过a=10),next(跳过b=20),step(进入c=a+b的赋值操作)print a(输出10),print b(输出20),print c(输出30)continue(程序输出结果并结束)quitAddressSanitizer(ASan),编译时添加-fsanitize=address选项:g++ -g -fsanitize=address -o my_program main.cpp 运行程序后,ASan会输出内存越界、未初始化访问等错误的详细信息(比Valgrind更快)。GProf分析函数调用时间和频率,编译时添加-pg选项:g++ -g -pg -o my_program main.cpp ./my_program # 运行程序生成gmon.out gprof ./my_program gmon.out > profile.txt # 生成性能报告 若偏好图形界面,可使用Visual Studio Code(VSCode):
C++、CMake Tools扩展。.vscode/launch.json文件,配置GDB调试:{ "version": "0.2.0", "configurations": [ { "name": "(gdb) Launch", "type": "cppdbg", "request": "launch", "program": "${workspaceFolder}/my_program", "args": [], "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], "externalConsole": false, "MIMode": "gdb", "setupCommands": [ { "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": true } ] } ] } F5启动调试,通过VSCode的图形界面设置断点、查看变量、单步执行。通过以上步骤,你可以在Debian系统上高效地调试C++程序,覆盖从基础断点到高级内存检测的需求。