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观察到的中间变量变化与代码逻辑一致即调试成功。
关键说明
- 断点命令
break可简写为b,continue简写为c,next简写为n。 - 条件断点格式:
break 行号 if 条件,仅在条件满足时暂停。 - 使用
info breakpoints查看所有断点,delete 断点编号删除指定断点。 - 若需进入函数内部调试,使用
step(简写s)代替next。