3. 条件断点与观察点
任务目标
本案例通过一个包含循环与变量修改的C程序,演示如何在GDB中设置条件断点(当特定条件满足时暂停)与观察点(监控变量值变化时暂停),并验证两种机制均能准确命中目标位置。
环境与准备
需要Linux环境与GDB(本文以GDB 12+为例)。创建以下C文件:
```c // watch_demo.c #include编译(-g 保留调试信息):
GDB调试命令
启动GDB并依次执行以下操作:
- 设置条件断点:在
sum += i * factor;行暂停,仅当i == 8时命中。 - 设置观察点:监控
factor变量,当其值从2变为4时暂停。 - 继续执行,观察两次暂停位置与变量值。
完整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的单次跳变,更易观察。