2010-09-17 4 views
7

J'essaye de déboguer un programme que j'ai écrit en C++. Voici le code:GDB étape sur la fonction (suivant) ne semble pas fonctionner

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

Je l'ai compilé en utilisant: g++ -g3 -O0 -o cards.exe cards.cpp. Voici la sortie de ma session 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) 

Ma question est, pourquoi l'envoi d'une commande à côté de gdb étape encore en fonction? J'utilise g ++ 4.2.1-sjlj et gdb 6.8.

+0

Avez-vous essayé quelque chose de plus complexe? – stefanB

+0

En fait oui, j'ai essayé de faire des invocations en boucle à un(). Ça ne marchera toujours pas. J'ai également essayé de désactiver Inline avec __attribute __ ((noinline)) mais en vain. J'ai essayé ceci sur mon Hackintosh et cela a fonctionné. –

Répondre

0

'n' est l'instruction suivante et n'interviendra pas dans la fonction.

Pour entrer dans la fonction, utilisez 's'. C'est étape.

+0

no. 'n' intervient dans la fonction. c'est le problème même que l'OP aborde. – Blauhirn

5

Les step et next commandes fonctionnent une ligne source à la fois, donc quand tout est sur une seule ligne d'un seul next me prend jusqu'à la fin de main(). Avec le code formaté moins densément, je ne vois toujours pas les résultats que vous voyez. Je place les appels de fonction sur des lignes séparées pour que gdb les enjambe un à la fois. Voici ce que je reçois alors:

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

Je n'ai pas une réponse, mais je voulais juste partager cette gdb se comporte comme prévu sur mon iMac. Dans les deux cas, gdb a traité l'appel à b() comme une seule instruction et n'a jamais entré l'appel de fonction.

+0

J'ai essayé d'utiliser votre code mais le fait de ne pas marcher dessus ne fonctionne toujours pas. Peut-être parce que nous utilisons différentes versions de gdb? –

+0

Que disent "help next" et "help step" sur votre machine? –

+0

(gdb) aide suivante Etape programme, en procédant à des appels de sous-programme. Comme la commande "step" tant que les appels de sous-programmes ne se produisent pas; quand ils le font, l'appel est traité comme une instruction. Argument N signifie faire N fois (ou jusqu'à ce que le programme s'arrête pour une autre raison). (gdb) help step Etape programme jusqu'à ce qu'il atteigne une ligne source différente. Argument N signifie faire N fois (ou jusqu'à ce que le programme s'arrête pour une autre raison). –

Questions connexes