2009-05-07 13 views
7

Traté de ver el cambio de "int a" con el comando "ver a". Sin embargo, el programa no se detiene, cuando cambia a 12. ¿Por qué?¿Cómo puedo usar "ver" GDB?

/* 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

¿Compiló con información de depuración (-g) y está seguro de que está utilizando la versión de depuración? – dirkgently

Respuesta

11

Puede ser útil especificar su plataforma, versión de GDB y secuencia exacta de comandos GDB que utilizó.

Aquí es lo que veo (BGF parece funcionar muy bien):

$ 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

El compilador es probable que ni siquiera la generación de código para asignar a 12 "a", que sería una buena idea para desensamblar el código generado para confirmar. Probablemente necesites una prueba un poco más compleja para probar esto.

3

Cuando desea depurar un programa siempre se debe construir con -O0 -g3 (retiro lo dicho se está empleando gcc, si no lo está, su compilador probablemente admita otros indicadores para rechazar la optimización y habilitar la información de depuración).

En mi sistema (x86_64 ejecutando Gentoo GNU/Linux) no puedo acceder a la línea 'int a = 12' cuando uso cualquier optimización mayor o igual a -O ya que el compilador aplicará dead code elimination. (Tomado de here, es el indicador -fdce en la sección -O)

¡Siempre tenga esto en cuenta cuando esté depurando! Verifique su código desensamblándolo con objdump -D o dígale a su compilador que le muestre el ensamblado generado (en gcc con el indicador -S)

Cuestiones relacionadas