Почему точка наблюдения не влияет? - PullRequest
1 голос
/ 26 декабря 2011

Я изучаю точку наблюдения 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 Ответ

1 голос
/ 26 декабря 2011

Это:

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

предполагает, что вы использовали -O2 или какой-либо такой флаг при построении теста.Попробуйте построить с -O0 (что явно отключит оптимизацию).

Даже в этом случае в GDB есть сбой (buglet).Вот что я вижу:

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