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
:))
首先,我有一个这样的无限循环:
#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
:))