首先,我有一个像这样的无限循环:
#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”时为什么不破坏? 感谢。
答案 0 :(得分:1)
当您观看auto
变量时,调试器需要提供上下文。
当您再次尝试run
程序时,gdb会警告您:您将丢失上下文,从而丢失硬件观察点(自动变量将被解除分配并重新分配)。
r/run
命令从一开始就运行程序。你将它与continue
混合在一起。只是自动变量的HW观察点被清除了一个非常不明确的警告,然后它就像无限循环一样运行
为了避免这种情况,有几种选择,所有这些都有其优点和缺点。缺点:
c
(继续)而不是r
:您的hw watchpoint将起作用:缺点:您无法键入r
(您将活下来)b 5.c:9 if i==10
(第9行是printf
的行)。缺点:性能会受到影响,因为每次都会触发断点,并且gdb根据条件决定是否中断i
global:允许在没有警告的情况下执行您想要的操作(重新启动),因为在这种情况下i
不是自动变量。缺点:全局变量不是最好的东西(特别是在命名为i
时::))