2009-10-18 12 views
10

in Linux e Mac OS X Posso usare stepi e nexti per eseguire il debug di un'applicazione senza eseguire il debug delle informazioni.Debug delle librerie smontate con gdb

Su Mac OS X gdb mostra le funzioni chiamate all'interno della libreria, sebbene a volte avanzino diverse istruzioni assembler in ciascuna istruzione stepi.

Su Linux, quando passo in una libreria dinamica gdb si perde. Per esempio, con puts() ci sono tre istruzioni assembler all'interno di puts(), una volta che gdb raggiunge il salto a 0x080482bf, fallisce con il messaggio "Nessuna funzione contiene il contatore di programma per il frame selezionato".

0x080482ba in [email protected]() 
(gdb) disassemble 
Dump of assembler code for function [email protected]: 
0x080482b4 <[email protected]+0>:  jmp *0x8049580 
0x080482ba <[email protected]+6>:  push $0x10 
0x080482bf <[email protected]+11>:  jmp 0x8048284 <_init+48> 
End of assembler dump. 
(gdb) stepi 
0x080482bf in [email protected]() 
(gdb) stepi 
0x08048284 in ??() 
(gdb) disassemble 
No function contains program counter for selected frame. 

Sai come eseguire il debug di queste chiamate di libreria con gdb.

+0

Quale versione di gdb? –

+0

Inoltre, cosa succede quando usi stepi su Linux? Dici che non puoi assolutamente seguire le istruzioni, ma non descrivi cosa succede realmente. Puoi pubblicare una sessione di esempio? –

+0

Grazie, sto usando Slackware 13.0 con il suo gdb preinstallato 6.8. Ho chiarito cosa succede. – Freeman

risposta

12

Se GDB non dispone di simboli di debug per la funzione che si sta tentando di eseguire il debug, GDB non sarà in grado di determinare l'intervallo di indirizzi di memoria da smontare. Per ovviare a questo problema, è possibile passare l'intervallo nel comando disassemble. Ad esempio:

(gdb) p $pc 
$4 = (void (*)()) 0x70c72d <_IO_puts+29> 
(gdb) disassemble 0x70c72d 0x70c740 
Dump of assembler code from 0x70c72d to 0x70c740: 
0x0070c72d <_IO_puts+29>: mov %eax,(%esp) 
0x0070c730 <_IO_puts+32>: call 0x721f10 <strlen> 
0x0070c735 <_IO_puts+37>: mov 0x84c(%ebx),%edx 
0x0070c73b <_IO_puts+43>: cmpw $0x0,(%edx) 
0x0070c73f <_IO_puts+47>: mov %edx,-0x10(%ebp) 
End of assembler dump. 

Potrebbe esserci un modo per installare i simboli di debug. Sul mio sistema Ubuntu, ho installato il pacchetto libc6-dbg, che mi consente di accedere alle funzioni nella libreria standard.

+3

GNU gdb (GDB) 7.4.1-debian. La sintassi corretta ora è 'smontare 0x70c72d, 0x70c740'. Quello deve essere virgola. – golem