2009-05-07 17 views
7

Próbowałem obejrzeć zmianę "int a" za pomocą polecenia "watch a". Jednak program się nie kończy, gdy zmienia się na 12. Dlaczego?Jak mogę użyć GDB "obejrzyj"?

/* FILE: test.c */ 
#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char** argv){ 
    printf("Hello world\n"); 

    int a = 12; 
    a = 10;                                          
    return 0; 
} 
+0

Czy skompilowałeś się z informacjami debugowania (-g) i czy na pewno używasz wersja debugowania? – dirkgently

Odpowiedz

11

Może pomóc w określeniu platformy, wersji GDB i dokładnej sekwencji użytych poleceń GDB.

Oto co widzę (GDB wydaje się działać dobrze):

$ gcc -g test.c 

$ gdb a.out 
GNU gdb (GDB) 6.8.50.20090430-cvs 
Copyright (C) 2009 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 "x86_64-unknown-linux-gnu". 
For bug reporting instructions, please see: 
<http://www.gnu.org/software/gdb/bugs/>... 
(gdb) list 
1  #include <stdio.h> 
2  #include <stdlib.h> 
3 
4  int main(int argc, char** argv){ 
5   printf("Hello world\n"); 
6 
7   int a = 12; 
8   a = 10;                                          
9   return 0; 
10  } 
11 
(gdb) b 5 
Breakpoint 1 at 0x4004a7: file test.c, line 5. 
(gdb) r 

Breakpoint 1, main (argc=1, argv=0x7fffffffdb28) at test.c:5 
5   printf("Hello world\n"); 
(gdb) watch a 
Hardware watchpoint 2: a 
(gdb) c 
Hello world 
Hardware watchpoint 2: a 

Old value = 0 
New value = 12 
main (argc=1, argv=0x7fffffffdb28) at test.c:8 
8   a = 10;                                          
(gdb) c 
Hardware watchpoint 2: a 

Old value = 12 
New value = 10 
main (argc=1, argv=0x7fffffffdb28) at test.c:9 
9   return 0; 
(gdb) c 

Watchpoint 2 deleted because the program has left the block in 
which its expression is valid. 
0x00007ffff7ab3033 in exit() from /lib/libc.so.6 
(gdb) c 

Program exited normally. 
(gdb) q 
1

Prawdopodobnie kompilator nie wygeneruje nawet kodu do przypisania 12 do "a", więc dobrze jest zdemontować wygenerowany kod w celu potwierdzenia. Prawdopodobnie potrzebujesz nieco bardziej złożonego testu, aby to wypróbować.

3

Gdy chcesz debugować program zawsze należy budować z -O0 -g3 (biorę, że używasz gcc, jeśli nie jesteś, twój kompilator prawdopodobnie będzie obsługiwał inne flagi, aby wyłączyć optymalizację i włączyć informacje debugowania).

W moim systemie (x86_64 z Gentoo GNU/Linux) nie mogę uzyskać linii "int a = 12", gdy używam optymalizacji większej lub równej -O, ponieważ kompilator następnie zastosuje dead code elimination. (Zaczerpnięte z here, jest to flaga -fdce w sekcji -O)

Należy o tym pamiętać podczas debugowania! Zweryfikuj swój kod, demontując go za pomocą objdump -D lub powiedz kompilatorowi, aby pokazał wygenerowany zespół (w gcc z flagą -S).