1. GDB基础断点设置与程序控制

任务目标

使用GDB对一个存在逻辑缺陷的C程序进行调试,通过设置断点、单步执行、继续运行等操作,定位并确认程序执行流程中的异常分支,最终找出变量值不符合预期的位置。

环境准备

需要Linux环境并安装GDB(gcc -g编译)。示例程序保存为 buggy.c:

#include <stdio.h>
int main() {
    int sum = 0;
    for (int i = 1; i <= 5; i++) {
        if (i == 3) {
            sum += i * 2;   // 故意写错:应为 sum += i
        } else {
            sum += i;
        }
    }
    printf("sum = %d\n", sum);
    return 0;
}

编译:gcc -g -o buggy buggy.c

GDB调试操作

启动GDB并执行以下命令序列:

gdb ./buggy
(gdb) break buggy.c:5          # 在for循环行设置断点
(gdb) run                      # 运行至第一个断点
(gdb) print i                  # 查看当前i值
(gdb) continue                 # 继续执行至下一次循环
(gdb) next                     # 单步执行(不进入函数)
(gdb) print sum                # 观察sum累加过程
(gdb) break buggy.c:7 if i==3  # 条件断点:i等于3时暂停
(gdb) continue
(gdb) print sum                # 此时应发现sum值异常
(gdb) quit

验证方法与判定标准

在条件断点触发时(i==3),观察sum的值:若执行next后sum从3直接变为9(而非6),则说明sum += i * 2分支被执行,确认逻辑错误位置。预期输出:程序最终打印sum = 18(正确结果应为15),通过GDB观察到的中间变量变化与代码逻辑一致即调试成功。

main() 入口 for 循环 i=1..5 i == 3 ? 是 (错误分支) 否 sum += i * 2 sum += i printf 输出结果 断点 条件断点

关键说明

  • 断点命令break可简写为b,continue简写为c,next简写为n。
  • 条件断点格式:break 行号 if 条件,仅在条件满足时暂停。
  • 使用info breakpoints查看所有断点,delete 断点编号删除指定断点。
  • 若需进入函数内部调试,使用step(简写s)代替next。