C GDB:变量值相等时中断

C GDB:变量值相等时中断,c,gdb,C,Gdb,我喜欢让GDB在变量等于我设置的某个值时设置断点,我尝试了以下示例: #include <stdio.h> main() { int i = 0; for(i=0;i<7;++i) printf("%d\n", i); return 0; } 正如您所看到的,GDB没有创建任何断点,这在GDB中可能吗?您可以为此使用一个监视点(数据上的断点而不是代码上的断点) 您可以从使用watchi开始 然后使用条件i==5为其设置一个条件

我喜欢让GDB在变量等于我设置的某个值时设置断点,我尝试了以下示例:

#include <stdio.h>
main()
{ 
     int i = 0;
     for(i=0;i<7;++i)
        printf("%d\n", i);

     return 0;
}

正如您所看到的,GDB没有创建任何断点,这在GDB中可能吗?

您可以为此使用一个监视点(数据上的断点而不是代码上的断点)

您可以从使用
watchi
开始
然后使用
条件i==5为其设置一个条件


您可以使用
info watch

获取断点编号。有硬件和软件监视点。它们用于读取和写入变量。您需要查阅以下教程:

要设置观察点,首先需要将代码分解到环境中存在varianle i的位置,然后设置观察点


watch
命令用于设置用于写入的watchpoit,而
rwatch
用于读取,而
awatch
用于读取/写入。

首先,您需要使用适当的标志编译代码,以启用调试到代码中

$ gcc -Wall -g -ggdb -o ex1 ex1.c
然后用你最喜欢的调试器运行你的代码

$ gdb ./ex1
给我看看代码

(gdb) list
1   #include <stdio.h>
2   int main(void)
3   { 
4     int i = 0;
5     for(i=0;i<7;++i)
6       printf("%d\n", i);
7   
8     return 0;
9   }
检查断点

(gdb) info b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x00000000004004fb in main at ex1.c:5
    breakpoint already hit 1 time
5       read watchpoint keep y                      i
    stop only if i==5
运行程序

(gdb) c
Continuing.
0
1
2
3
4
Hardware read watchpoint 5: i

Value = 5
0x0000000000400523 in main () at ex1.c:5
5     for(i=0;i<7;++i)
(gdb)c
持续的。
0
1.
2.
3.
4.
硬件读取观察点5:i
值=5
ex1.c:5处的main()中的0x0000000000400523

5表示(i=0;i以及嵌套在断点内的观察点 您还可以在“filename:line_number”上设置一个断点并使用条件。 我觉得有时候更容易

(gdb) break iter.c:6 if i == 5
Breakpoint 2 at 0x4004dc: file iter.c, line 6.
(gdb) c
Continuing.
0
1
2
3
4

Breakpoint 2, main () at iter.c:6
6           printf("%d\n", i);
如果你像我一样厌倦了改变行号,你可以添加一个标签 然后在标签上设置断点,如下所示:

#include <stdio.h>
main()
{ 
     int i = 0;
     for(i=0;i<7;++i) {
       looping:
        printf("%d\n", i);
     }
     return 0;
}

(gdb) break main:looping if i == 5
#包括
main()
{ 
int i=0;

对于(i=0;i
(gdb)在当前上下文中观察i无符号“i”。
您必须位于代码中存在
i
的位置。请尝试
断开main
运行
c
s
(确保通过声明的步骤),然后是答案上的命令。确保使用
-g
标志编译程序。(即,使用调试信息)在执行开始之前,可能尚未加载与主可执行文件链接的其他编译单元/文件。一个很好的选项是使用
start
,这类似于
tb main
run
。这将启动程序,使您可以更轻松地设置断点/观察点。
(gdb) break iter.c:6 if i == 5
Breakpoint 2 at 0x4004dc: file iter.c, line 6.
(gdb) c
Continuing.
0
1
2
3
4

Breakpoint 2, main () at iter.c:6
6           printf("%d\n", i);
#include <stdio.h>
main()
{ 
     int i = 0;
     for(i=0;i<7;++i) {
       looping:
        printf("%d\n", i);
     }
     return 0;
}

(gdb) break main:looping if i == 5