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

时间:2016-10-18 11:23:00

标签: gcc gdb conditional-statements break watch

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

#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”时为什么不破坏? 感谢。

1 个答案:

答案 0 :(得分:1)

当您观看auto变量时,调试器需要提供上下文。

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

r/run命令从一开始就运行程序。你将它与continue混合在一起。只是自动变量的HW观察点被清除了一个非常不明确的警告,然后它就像无限循环一样运行

为了避免这种情况,有几种选择,所有这些都有其优点和缺点。缺点:

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