gdb "watch" 命令打破了我的循环?

gdb "watch" command breaks my loop?

首先,我有一个这样的无限循环:

#include<stdio.h>
int main(){
  int i=0;
  int b=1;
  while(b) 
  {
    ++i;
    printf("%d\n",i);
  }
  return 0;
}

我试着编译它,运行 在 gdb 中,当 "i==10" 时中断,所以我:

gcc 5.c -g && gdb a.out

(gdb) b main
Breakpoint 1 at 0x4005a3: file 5.c, line 3.
(gdb) r
Starting program: /home/console/a.out 

Breakpoint 1, main () at 5.c:3
3     int i=0;
(gdb) watch i==10
Hardware watchpoint 2: i==10
(gdb) r
The program being debugged has been started already.

嗯,程序好像在"r"之后就结束了。为什么它在 "i==10" 时不中断? 谢谢

当您查看 auto 变量时,调试器需要有可用的上下文。

当您再次尝试 run 程序时,gdb 会警告您:您将丢失上下文并因此丢失硬件观察点(自动变量将被释放和重新分配)。

r/run 命令从头开始运行程序。你把它和 continue 搞混了。只是自动变量上的 HW 观察点被清除了一个非常不清楚的警告,之后它作为无限循环运行

为了避免这种情况,有几种选择,它们各有利弊:

  • 只需执行 c(继续)而不是 r:您的硬件观察点将起作用:缺点:您不能键入 r(您将存活下来)
  • 将您的硬件断点替换为条件断点b 5.c:9 if i==10(第 9 行是 printf 的行)。缺点:性能会受到影响,因为每次都会触发断点,gdb根据条件决定是否中断
  • make g i global:允许在没有警告的情况下做你想做的事(重启),因为在那种情况下 i 不是自动变量。缺点:全局变量不是最好的东西(特别是当命名为 i :))