99

当变量等于我设置的某个值时,我喜欢让 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 可以做到这一点吗?

4

4 回答 4

136

除了嵌套在断点内的观察点之外,您还可以在“文件名:行号”上设置单个断点并使用条件。我发现有时更容易。

(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
于 2013-01-18T00:43:05.927 回答
32

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

您可以从使用watch i.
然后使用condition <breakpoint num> i == 5

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

于 2013-01-18T00:00:37.947 回答
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)
于 2013-01-18T00:37:09.943 回答
4

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

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

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

watch命令用于设置写、rwatch读和awatch读/写的观察点。

于 2013-01-18T00:21:42.000 回答