2010-09-17 15 views
7

Sto provando a eseguire il debug di un programma che ho scritto in C++. Ecco il codice:La funzione passo-passo di GDB (successiva) non sembra funzionare

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

L'ho compilato utilizzando: g++ -g3 -O0 -o cards.exe cards.cpp. Qui è l'uscita della mia sessione di 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) 

La mia domanda è, perché l'invio di un comando accanto al gdb ancora un passo in una funzione? Sto usando g ++ 4.2.1-sjlj e gdb 6.8.

+0

Hai provato qualcosa di più complesso? – stefanB

+0

In effetti sì, ho provato a fare invocazioni loop su a(). Ancora non funzionerà. Ho anche provato a disabilitare la funzione di inlining con __attribute __ ((noinline)) ma inutilmente. Ho provato questo sul mio Hackintosh e ha funzionato. –

risposta

0

'n' è l'istruzione successiva e non passerà alla funzione.

Per accedere alla funzione, utilizzare "s". Questo è un passo.

+0

no. 'n' fa un passo nella funzione. questo è il vero problema che l'OP sta affrontando. – Blauhirn

5

I comandi step e next lavorare una riga di codice sorgente in un momento, in modo che quando tutto è tutto su una riga un singolo next mi porta fino alla fine di main().

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

Con il codice formattato in modo meno denso, continuo a non vedere i risultati visualizzati. Ho messo le chiamate di funzione su linee separate per far sì che gdb le scavalchi una alla volta. Ecco cosa ottengo allora:

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

Non ho una risposta, ma ho solo voluto condividere che gdb si comporta come previsto sul mio iMac. In entrambi i casi, gdb ha trattato la chiamata a b() come una sola istruzione e non ha mai inserito la chiamata di funzione.

+0

Ho provato a usare il tuo codice ma il passaggio non funziona ancora. Forse perché stiamo usando diverse versioni di gdb? –

+0

Che cosa dicono 'help next' e' help step' sulla macchina? –

+0

(gdb) help next Passo programma, passando attraverso le chiamate di subroutine. Come il comando "step" finché le chiamate di subroutine non avvengono; quando lo fanno, la chiamata viene trattata come un'unica istruzione. L'argomento N significa fare questo N volte (o fino a quando il programma si ferma per un altro motivo). (gdb) passo di aiuto Passo programma fino a quando non raggiunge una linea di origine diversa. L'argomento N significa fare questo N volte (o fino a quando il programma si ferma per un altro motivo). –

Problemi correlati