GDB基本使用教程
1. 编译带调试信息的程序
在编译程序时,需要添加`-g`选项以生成调试信息。例如,使用`g++`编译C++程序时,命令如下:
```bash
g++ -g -o my_program my_program.cpp
```
2. 启动GDB
启动GDB并加载程序,使用以下命令:
```bash
gdb ./my_program
```
3. 调试流程
设置断点:使用`break`命令在指定位置设置断点,例如:
```gdb
break my_program.cpp:42
```
运行程序:使用`run`命令启动程序,直到断点处暂停:
```gdb
run
```
检查状态:使用`print`命令查看变量值,使用`backtrace`命令查看调用栈:
```gdb
print my_variable
backtrace
```
单步执行:使用`step`命令逐行执行代码,`next`命令逐行执行但不进入函数内部:
```gdb
step
next
```
修复问题:找到问题后,修改代码并重新编译测试。
4. 常用GDB命令
设置断点:`break`命令用于在源文件的具体行或函数中设置断点。
运行程序:`run`命令用于启动程序,`continue`命令用于继续执行程序直到遇到下一个断点。
单步执行:`step`命令用于逐行执行代码并进入函数内部,`next`命令用于逐行执行但不进入函数内部。
查看变量:`print`命令用于查看变量的值。
查看堆栈信息:`backtrace`命令用于查看当前堆栈信息。
结束程序:`quit`命令用于退出GDB。
5. 高级功能
使用Python脚本:GDB支持Python脚本,可以通过编写Python脚本来扩展GDB的功能,例如自定义命令来显示变量信息。
条件断点:使用`condition`命令设置条件断点,当条件满足时才会暂停程序。
观察点:使用`watch`命令监控变量值的变化。
捕捉断点:使用`catch`命令建立捕捉断点,当特定事件发生时暂停程序。
示例
假设有一个C++程序`calculateAverage`,计算数组平均值并存在潜在的除零错误。编译并调试该程序的步骤如下:
编译程序
```bash
g++ -g calculateAverage.cpp -o calculateAverage
```
启动GDB
```bash
gdb ./calculateAverage
```
设置断点
```gdb
break calculateAverage.cpp:10
```
运行程序
```gdb
run
```
检查状态
```gdb
print arr
print size
```
单步执行
```gdb
step
next
```
修复问题
发现除零错误后,修改代码:
```cpp
double calculateAverage(int arr[], int size) {
if (size == 0) return 0;
int sum = 0;
for (int i = 0; i < size; i++) {
sum += arr[i];
}
return sum / size;
}
```
重新编译并测试
```bash
g++ -g calculateAverage.cpp -o calculateAverage
gdb ./calculateAverage
run
```
通过以上步骤,可以使用GDB有效地调试C++程序,并找到并修复错误。