为什么watchpoint不起作用?

时间:2011-12-26 13:20:33

标签: gdb watchpoint

我正在研究GDB的观点。我写了一个简单的测试代码如下:

int main(int argc, char **argv)
{
    int x = 30;
    int y = 10;

    x = y;

    return 0;
}

I build it via gcc -g -o wt watch.c. And then I started gdb and did following experiment:
    lihacker@lihacker-laptop:~/mySrc$ gdb ./wt
    GNU gdb (GDB) 7.3
    Copyright (C) 2011 Free Software Foundation, Inc.
    License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
    and "show warranty" for details.
    This GDB was configured as "i686-pc-linux-gnu".
    For bug reporting instructions, please see:
    <http://www.gnu.org/software/gdb/bugs/>...
    Reading symbols from /home/lihacker/mySrc/wt...done.
    (gdb) b main
    Breakpoint 1 at 0x80483a5: file watch.c, line 5.
    (gdb) run
    Starting program: /home/lihacker/mySrc/wt 

    Breakpoint 1, main (argc=<optimized out>, argv=<optimized out>) at watch.c:5
    5     int x = 30;
    (gdb) watch x
    Hardware watchpoint 2: x
    (gdb) c
    Continuing.

    Watchpoint 2 deleted because the program has left the block in
    which its expression is valid.
    0xb7e83775 in __libc_start_main () from /lib/tls/i686/cmov/libc.so.6
    (gdb) 

在我的测试代码中,变量“x”已更改,但gdb不会停止。 观察点为何不起作用?非常感谢。

1 个答案:

答案 0 :(得分:1)

此:

  

Breakpoint 1, main (argc=<optimized out>, argv=<optimized out>) at watch.c:5

建议您在构建测试时使用-O2或一些此类标记。尝试使用-O0进行构建(这将明确禁用优化)。

即使这样,GDB中也存在一个小故障(一个小故障)。这就是我所看到的:

(gdb) b main
Breakpoint 3 at 0x80483ba: file t.c, line 3.
(gdb) r

Breakpoint 3, main (argc=1, argv=0xffffca94) at t.c:3
3       int x = 30;
(gdb) watch x
Hardware watchpoint 4: x
(gdb) c
Hardware watchpoint 4: x

Old value = 0
New value = 10
main (argc=1, argv=0xffffca94) at t.c:8
8       return 0;
(gdb) c

Watchpoint 4 deleted because the program has left the block in
which its expression is valid.
0xf7e7cbd6 in __libc_start_main () from /lib32/libc.so.6

这不可能是正确的:x的值从30变为10,而不是从0变为10.

如果我在main的第一条指令上设置断点,然后它按预期工作:

(gdb) b *main
Breakpoint 1 at 0x80483b4: file t.c, line 2.
(gdb) r

Breakpoint 1, main (argc=1, argv=0xffffca94) at t.c:2
2   {
(gdb) watch x
Hardware watchpoint 2: x
(gdb) c
Hardware watchpoint 2: x

Old value = 0
New value = 30
main (argc=1, argv=0xffffca94) at t.c:4
4       int y = 10;
(gdb) c
Hardware watchpoint 2: x

Old value = 30
New value = 10
main (argc=1, argv=0xffffca94) at t.c:8
8       return 0;
(gdb) c

Watchpoint 2 deleted because the program has left the block in
which its expression is valid.
0xf7e7cbd6 in __libc_start_main () from /lib32/libc.so.6
相关问题