1. 使用GDB进行断点调试
任务目标
本案例使用GDB对一个包含除零错误的C程序进行调试,通过设置断点、单步执行、查看变量值,最终定位程序崩溃的具体代码行。
环境准备
需要Linux环境并安装GDB(sudo apt-get install gdb)。使用-g选项编译程序以生成调试信息。
示例程序
// crash.c
#include <stdio.h>
int divide(int a, int b) {
return a / b; // 当b为0时触发除零错误
}
int main() {
int x = 10;
int y = 0;
int result = divide(x, y);
printf("Result: %d\n", result);
return 0;
}
编译与启动GDB
gcc -g -o crash crash.c
gdb ./crash
GDB调试命令序列
在GDB交互界面中依次执行以下命令:
(gdb) break main # 在main函数入口设置断点
(gdb) run # 运行程序,停在main入口
(gdb) next # 单步执行,跳过变量初始化
(gdb) next # 执行到divide函数调用前
(gdb) print x # 查看变量x的值,预期输出 $1 = 10
(gdb) print y # 查看变量y的值,预期输出 $2 = 0
(gdb) step # 进入divide函数内部
(gdb) print a # 查看参数a,预期输出 $3 = 10
(gdb) print b # 查看参数b,预期输出 $4 = 0
(gdb) next # 执行除法操作,此时触发除零错误
(gdb) bt # 查看调用栈,确认崩溃位置
验证方法与判定标准
执行bt命令后,GDB会显示调用栈回溯信息。若程序因除零崩溃,栈顶应显示divide函数位于crash.c:4(即return a / b;所在行),下方为main函数调用位置。观察到该调用栈即说明已成功定位崩溃点。
若希望程序继续执行以观察GDB如何处理信号,可输入continue,GDB会报告收到SIGFPE信号(算术异常),进一步确认崩溃原因为除零操作。
关键点说明
break用于设置断点,可指定函数名或文件名:行号;next单步执行且不进入函数,step会进入被调函数内部;print在断点处查看变量当前值,是定位逻辑错误的核心手段;bt(backtrace)打印函数调用栈,崩溃后第一时间执行可快速定位出错函数与调用关系。