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)打印函数调用栈,崩溃后第一时间执行可快速定位出错函数与调用关系。
GDB断点调试流程 gcc -g -o crash crash.c gdb ./crash break main run next / step 单步执行 print x / print y 查看变量 next → 触发除零错误 bt → 查看调用栈定位崩溃 预期调用栈 #0 divide (crash.c:4) #1 main (crash.c:10) SIGFPE 除零异常