GDB:如果变量等于值则中断


89

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

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

     return 0;
}

GDB的输出:

(gdb) break if ((int)i == 5)
No default breakpoint address now.
(gdb) run
Starting program: /home/SIFE/run 
0
1
2
3
4
5
6

Program exited normally.
(gdb)

如您所见,GDB没有任何断点,GDB是否可以做到这一点?

Answers:


123

除了嵌套在断点内的观察点之外,您还可以在'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

30

您可以为此使用观察点(数据而不是代码的断点)。

您可以使用开始watch i
然后使用设置条件condition <breakpoint num> i == 5

您可以通过使用获取断点号 info watch


3
(gdb) watch i No symbol "i" in current context.
SIFE 2013年

2
您必须位于代码中i存在的位置。尝试break mainruncs(步骤,以确保你过去的声明),然后对答案的命令。确保使用该-g标志编译程序。(即带有调试信息)
不真实的

在开始执行之前,与您的主要可执行文件链接的其他编译单元/文件可能尚未加载。一个漂亮的选择是,然后使用start <args>,这就好比tb mainrun <args>。这将启动程序,使您可以更轻松地设置中断/监视点。
JWCS

9

首先,您需要使用适当的标志来编译代码,以便对代码进行调试。

$ 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   }

在第5行中断并查看i == 5。

(gdb) b 5
Breakpoint 1 at 0x4004fb: file ex1.c, line 5.
(gdb) rwatch i if i==5
Hardware read watchpoint 5: i

检查断点

(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)

4

有硬件和软件观察点。它们用于读取和写入变量。您需要参考教程:

http://www.unknownroad.com/rtfm/gdbtut/gdbwatch.html

要设置观察点,首先需要将代码分解到环境中存在变量i的地方,然后设置观察点。

watch命令用于设置监视,写入rwatchawatch读取/写入的监视点。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.