2010-01-29 9 views
5

È possibile utilizzare GDB come se fosse un monitor di assemblaggio tradizionale?Uso di gdb come monitor?

Non appena si entra in es. Code Library restituisce:

No function contains program counter for selected frame 

GDB il debugger è in grado di entrare in codice sconosciuto, ma GDB l'interfaccia utente smette di funzionare.

In questo relativo question è possibile trovare una coppia di soluzioni proposte, ma né abbastanza mi soddisfa.

Cosa succede se la libreria binaria non viene fornita con un pacchetto di simboli di debug? Cosa succede se il programma salta nel codice generato in fase di esecuzione?

Disassemblare il codice non è davvero una soluzione, poiché l'interfaccia utente lo ignora, ma soprattutto i valori dei registri non vengono aggiornati finché non si ritorna al codice noto originale. info registers funziona, ma non è interattivo.

Qualche suggerimento?

Grazie!

risposta

8

È possibile eseguire questo tipo di operazioni con il comando display.

display/i $pc sarà smontare l'istruzione corrente poco prima del prompt viene stampato ogni volta:

(gdb) b main 
Breakpoint 1 at 0x80483b5: file hw.c, line 5. 
(gdb) display/i $pc 
(gdb) r 
Starting program: /tmp/hw 

Breakpoint 1, main() at hw.c:5 
5   puts("Hello world"); 
1: x/i $pc 
0x80483b5 <main+17>: movl $0x8048490,(%esp) 

Ora passo un'istruzione (poi basta continuare a colpire Invio per ripetere):

(gdb) si 
0x080483bc  5   puts("Hello world"); 
1: x/i $pc 
0x80483bc <main+24>: call 0x80482d4 <[email protected]> 
(gdb) 
0x080482d4 in [email protected]() 
1: x/i $pc 
0x80482d4 <[email protected]>: jmp *0x804959c 
Current language: auto; currently asm 
(gdb) 
0x080482da in [email protected]() 
1: x/i $pc 
0x80482da <[email protected]+6>: push $0x10 
(gdb) 
0x080482df in [email protected]() 
1: x/i $pc 
0x80482df <[email protected]+11>:  jmp 0x80482a4 <_init+48> 

'ancora funziona quando arriviamo a questo punto:

(gdb) 
0x080482a4 in ??() 
1: x/i $pc 
0x80482a4 <_init+48>: pushl 0x804958c 
(gdb) 
0x080482aa in ??() 
1: x/i $pc 
0x80482aa <_init+54>: jmp *0x8049590 
(gdb) 
0xb7f052d0 in _dl_runtime_resolve() from /lib/ld-linux.so.2 
1: x/i $pc 
0xb7f052d0 <_dl_runtime_resolve>:  push %eax 

È possibile attivare contemporaneamente più di un'espressione display (utilizzare undisplay <number> per rimuoverli). Ad esempio, per vedere cosa succede a %eax:

(gdb) display/x $eax 
2: /x $eax = 0xbf90ab34 
(gdb) si 
0xb7f052d1 in _dl_runtime_resolve() from /lib/ld-linux.so.2 
2: /x $eax = 0xbf90ab34 
1: x/i $pc 
0xb7f052d1 <_dl_runtime_resolve+1>:  push %ecx 
(gdb) 
0xb7f052d2 in _dl_runtime_resolve() from /lib/ld-linux.so.2 
2: /x $eax = 0xbf90ab34 
1: x/i $pc 
0xb7f052d2 <_dl_runtime_resolve+2>:  push %edx 
(gdb) 
0xb7f052d3 in _dl_runtime_resolve() from /lib/ld-linux.so.2 
2: /x $eax = 0xbf90ab34 
1: x/i $pc 
0xb7f052d3 <_dl_runtime_resolve+3>:  mov 0x10(%esp),%edx 
(gdb) 
0xb7f052d7 in _dl_runtime_resolve() from /lib/ld-linux.so.2 
2: /x $eax = 0xbf90ab34 
1: x/i $pc 
0xb7f052d7 <_dl_runtime_resolve+7>:  mov 0xc(%esp),%eax 

... e qui il cambiamento di %eax può essere visto:

(gdb) 
0xb7f052db in _dl_runtime_resolve() from /lib/ld-linux.so.2 
2: /x $eax = 0xb7f0d668 
1: x/i $pc 
0xb7f052db <_dl_runtime_resolve+11>: call 0xb7eff780 <_dl_fixup> 
(gdb) 
+0

meglio che l'alternativa, ma non funziona con il TUI su . Segnalo ancora come risposta accettata dopo un po ', mentre mi rendo conto che potrebbe non esserci alcuna soluzione reale. – jbcreix