3. 条件断点与观察点

条件断点与观察点 学习卡片

任务目标

本案例通过一个包含循环与变量修改的C程序,演示如何在GDB中设置条件断点(当特定条件满足时暂停)与观察点(监控变量值变化时暂停),并验证两种机制均能准确命中目标位置。

环境与准备

需要Linux环境与GDB(本文以GDB 12+为例)。创建以下C文件:

```c // watch_demo.c #include int main() { int sum = 0; int factor = 2; for (int i = 1; i <= 10; i++) { sum += i * factor; if (i == 5) { factor = 4; // 第5次循环后修改factor } } printf("sum = %d\n", sum); return 0; } ```

编译(-g 保留调试信息):

```bash gcc -g -o watch_demo watch_demo.c ```

GDB调试命令

启动GDB并依次执行以下操作:

  1. 设置条件断点:在 sum += i * factor; 行暂停,仅当 i == 8 时命中。
  2. 设置观察点:监控 factor 变量,当其值从2变为4时暂停。
  3. 继续执行,观察两次暂停位置与变量值。

完整GDB命令序列:

```bash gdb ./watch_demo # 在GDB内部执行: (gdb) break 7 if i == 8 (gdb) watch factor (gdb) run # 第一次暂停:条件断点命中,此时 i=8, factor=4(因为factor已在i=5时被修改) (gdb) print i (gdb) print factor (gdb) continue # 第二次暂停:观察点命中,提示 factor 值发生变化(从2变为4) (gdb) print factor (gdb) continue # 程序运行至结束 ```

验证方法与判定标准

执行上述命令后,按以下标准确认调试成功:

  • 条件断点验证:第一次暂停时,GDB提示 Breakpoint 1, main () at watch_demo.c:7,且 print i 输出 $1 = 8。若断点无条件,则会在 i=1 时首次暂停,此处条件断点确保跳过前7次循环。
  • 观察点验证:第二次暂停时,GDB提示 Hardware watchpoint 2: factor 并显示 Old value = 2、New value = 4。这证明观察点捕获了 factor 在 i==5 时的赋值操作。
  • 程序完整性:最终 continue 后程序正常退出,输出 sum = 190(可通过手动计算验证:前4次循环 sum=2+4+6+8=20,第5次 sum+=10 后 factor 变为4,第6~10次 sum+=24+28+32+36+40=160,总计 20+10+160=190)。

关键说明

  • 观察点依赖硬件寄存器,若环境不支持(提示 Could not insert hardware watchpoint),可改用软件观察点 rwatch factor 或 awatch factor,但本案例中 watch 已足够。
  • 条件断点中的变量 i 必须在当前作用域可见,此处 i 为 for 循环局部变量,在断点行(第7行)作用域内有效。
  • 若需观察表达式变化(如 sum 每次增加的值),可使用 watch sum,但会频繁触发;本案例聚焦 factor 的单次跳变,更易观察。