2012-07-28 14 views
7

Este es el programa que estoy tratando de depuración:¿Por qué gdb se detiene en una línea diferente de la que muestra "i b" al regresar de la función?

#include <stdio.h> 
int i = 5; 

int main(void) 
{ 
    int x = 3; 

    display(x); 
    return 0; 
} 


void display(int x) 
{ 
for (i=0; i<x; ++i) { 
    printf("i is %d.\n", i); 
} 
} 

Este código está viniendo de aquí http://www.dirac.org/linux/gdb/05-Stepping_And_Resuming.php#breakpointsandwatchpoints. Aquí está el problema:

(gdb) break display 
Breakpoint 1 at 0x40051e: file try5.c, line 15. 
(gdb) run 
Starting program: /home/ja/gdb/learning/try5 

Breakpoint 1, display (x=3) at try5.c:15 
(gdb) frame 1 
#1 0x000000000040050c in main() at try5.c:8 
(gdb) break 
Breakpoint 2 at 0x40050c: file try5.c, line 8. 
(gdb) c 
Continuing. 
i is 0. 
i is 1. 
i is 2. 

Breakpoint 2, main() at try5.c:9 
(gdb) i b 
Num  Type   Disp Enb Address   What 
1  breakpoint  keep y 0x000000000040051e in display at try5.c:15 
    breakpoint already hit 1 time 
2  breakpoint  keep y 0x000000000040050c in main at try5.c:8 
    breakpoint already hit 1 time 
(gdb) c 
Continuing. 

Program exited normally. 
(gdb) q 

Debugger finished 

Se suponía que iba a parar en la línea 8 en main() pero se detuvo en la línea 9 que main(). Para mí es engañoso. Creo que debería detenerse en la línea 9, porque esto es lo que hacen los comandos 'break': establece un punto de corte en la próxima instrucción. ¿Pero por qué "puntos de interrupción de información" dicen que el punto de ruptura se estableció en la línea 8?

+0

¿qué hay de poner cierre-soporte cerca de la devolución 0; ? ¿Las líneas comienzan desde 0 o 1? –

+0

Tengo una duda de que su programa incluso compila ... 'void display (int x)' se define ** después de que ** se usa. ¡Esto debería haber sido un error del compilador! – YePhIcK

+0

@ tuğrul büyükışık - gracias, arreglé ese – user1042840

Respuesta

4

El punto de interrupción se coloca en el lugar derecho, como viste, porque se rompió después de regresar de la función. Si lo hace un desmonte, también verá que el punto de corte se coloca en la instrucción de la derecha (en este ejemplo a 0x00401192):

b display 
r 
f 1 
b 
disassemble $pc 
... 
    0x0040118d <+29>: call 0x401199 <display> 
=> 0x00401192 <+34>: mov $0x0,%eax 
    0x00401197 <+39>: leave 

i b 
... 
2  breakpoint  keep y 0x00401192 in main at try5.c:8 

pero muestra el número de línea incorrecta. Primero pensé que podría estar relacionado con el retorno de la función, así que agregué instrucciones adicionales después de la llamada a la pantalla, pero todavía muestra la línea incorrecta.

Esto me parece un error.

+0

¿Crees que es un error en gdb? Como sería una buena explicación para esto, es difícil para que yo crea. Espero que otras personas den su opinión también. – user1042840

+0

"nunca culpes al compilador/depurador", pero en este caso parece que sí ... Creo que gdb deduce el número de línea de la dirección de instrucción, lo que hace es aún más difícil entender cómo gdb podría estropear esto ... –

+0

Me actualicé a gdb 7.4.1 y la situación es la misma – user1042840

Cuestiones relacionadas