在Debian上调试C++代码的详细步骤
调试C++代码需要编译器(带调试支持)和调试器。在Debian上,通过以下命令安装build-essential(包含g++编译器)和gdb(GNU调试器):
sudo apt update
sudo apt install build-essential gdb
使用g++编译C++代码时,必须添加-g选项,以在可执行文件中嵌入源代码级别的调试信息(如变量名、行号)。例如:
g++ -g -o my_program main.cpp # 编译main.cpp生成带调试信息的可执行文件my_program
注意:调试时不要使用-O2、-O3等优化选项,否则编译器会优化代码结构,导致调试信息与源代码不一致(如变量被优化掉、行号错乱)。
通过终端启动GDB并加载编译好的可执行文件:
gdb ./my_program
启动后,GDB会显示程序的基本信息(如文件名、编译时间)。
断点是调试的核心工具,用于暂停程序执行以检查状态。常用命令:
break main:在main函数入口处设置断点;break 文件名:行号:在指定文件的特定行设置断点(如break main.cpp:10表示在第10行设置断点);break 函数名:在指定函数(如break myFunction)处设置断点。输入run(或简写r)启动程序。若设置了断点,程序会在断点处暂停;若未设置断点,程序会正常执行到结束。
(gdb) run
Starting program: /path/to/my_program
...
Breakpoint 1, main () at main.cpp:5 # 程序在main.cpp第5行暂停
next(或简写n):执行下一行代码,跳过函数调用(如func()会直接执行完函数,不进入函数内部);step(或简写s):执行下一行代码,进入函数调用(如func()会进入函数内部,便于调试函数逻辑)。print 变量名(或简写p 变量名):打印指定变量的值(如print x显示变量x的当前值);info locals:显示当前函数的所有局部变量及其值;print 变量名=新值:修改变量的值(如print x=10将x的值改为10)。backtrace(或简写bt):显示函数的调用链,帮助理解程序的执行流程(如从main函数到当前函数的调用路径)。
continue(或简写c):继续执行程序,直到遇到下一个断点或程序结束。
quit(或简写q):退出GDB调试器。
假设调试一个计算两数之和的C++程序(main.cpp):
#include <iostream>
int add(int a, int b) {
return a + b;
}
int main() {
int x = 5, y = 10;
int sum = add(x, y);
std::cout << "Sum: " << sum << std::endl;
return 0;
}
调试步骤:
g++ -g -o my_program main.cpp;gdb ./my_program;add函数入口设置断点:break add;run;add函数:step;print a(显示a=5)、print b(显示b=10);continue;print sum(显示sum=15);quit。若偏好图形界面,可使用以下工具:
C/C++扩展和CodeLLDB扩展,配置launch.json文件(指定可执行文件路径和调试器类型),即可实现图形化调试。图形化工具降低了命令行学习成本,适合新手或复杂项目调试。