2010-09-17 20 views
7

Estoy intentando depurar un programa que escribí en C++. Aquí está el código:GDB step over function (next) no parece funcionar

void a() { } 
void b() { a(); } 
int main() { b(); return 0; } 

I compilado usando: g++ -g3 -O0 -o cards.exe cards.cpp. Aquí está la salida de mi sesión de GDB:

(gdb) b main 
Breakpoint 1 at 0x401421: file cards.cpp, line 10. 
(gdb) r 
Starting program: C:\workspace\Cards\src/cards.exe 
[New thread 1624.0xa28] 
Breakpoint 1, main() at cards.cpp:10 
10 int main() 
(gdb) n 
12  b(); 
(gdb) n 
b() at cards.cpp:5 5 
void b() 
(gdb) n 
7  a(); 
(gdb) quit 
The program is running. Exit anyway? (y or n) 

Mi pregunta es, ¿por qué el envío de un comando junto a GDB todavía entrar en una función? Estoy usando g ++ 4.2.1-sjlj y gdb 6.8.

+0

¿Has probado algo más complejo? – stefanB

+0

En realidad sí, he intentado hacer invocaciones en bucle a a(). Aún no funcionará También intenté desactivar Inline con __attribute __ ((noinline)) pero fue en vano. He intentado esto en mi Hackintosh y funcionó. –

Respuesta

0

'n' es la siguiente declaración y no entrará en la función.

Para entrar en la función, use 's'. Ese es el paso.

+0

no. 'n' SI entra en la función. ese es el problema que OP está abordando. – Blauhirn

5

Los step y next comandos funcionan una línea fuente a la vez, por lo que todo está en una sola línea de un solo next me lleva hasta el final de main().

3 int main() { b(); return 0; } 
(gdb) n 
0x00001faa in start() 

Con el código formateado con menos densidad todavía no veo los resultados que ve. Puse las llamadas a funciones en líneas separadas para hacer que gdb las pise de a una por vez. Esto es lo que me sale a continuación:

jkugelman$ cat cards.cpp 
void a() { 
} 

void b() { 
    a(); 
} 

int main() { 
    b(); 
    return 0; 
} 
jkugelman$ g++ -g3 -O0 -o cards cards.cpp 
jkugelman$ gdb ./cards 
GNU gdb 6.3.50-20050815 (Apple version gdb-960) (Sun May 18 18:38:33 UTC 2008) 
<snip> 
Reading symbols for shared libraries .... done 

(gdb) b main 
Breakpoint 1 at 0x1ff2: file cards.cpp, line 9. 
(gdb) r 
Starting program: /Users/jkugelman/Development/StackOverflow/cards 
Reading symbols for shared libraries +++. done 

Breakpoint 1, main() at cards.cpp:9 
9  b(); 
(gdb) n 
10  return 0; 
(gdb) n 
11 } 
(gdb) n 
0x00001faa in start() 

que no tienen una respuesta, pero yo sólo quería compartir que GDB se comporta como se esperaba en mi iMac. En cualquier caso, gdb trató la llamada a b() como una sola instrucción y nunca ingresó a la llamada de función.

+0

Intenté usar tu código, pero dar un paso al frente todavía no funciona. Tal vez porque estamos usando diferentes versiones de gdb? –

+0

¿Qué dicen 'help next' y' help step' en tu máquina? –

+0

(gdb) help next Programa de pasos, a través de llamadas de subrutinas. Al igual que el comando "paso", siempre que las llamadas de subrutina no sucedan; cuando lo hacen, la llamada se trata como una sola instrucción. Argumento N significa hacer esto N veces (o hasta que el programa se detenga por otro motivo). (gdb) help step Programe el programa hasta que llegue a una línea de origen diferente. Argumento N significa hacer esto N veces (o hasta que el programa se detenga por otro motivo). –

Cuestiones relacionadas