2010-01-29 15 views
5

Kann GDB so verwendet werden, als wäre es ein herkömmlicher Montagemonitor?Verwenden von gdb als Monitor?

Sobald Sie in z. Bibliothekscode kehrt:

No function contains program counter for selected frame 

GDB der Debugger der Lage ist, in unbekanntem Code zu Schritt aber GDB die UI nicht mehr funktioniert.

In diesem verwandten question können Sie ein paar vorgeschlagene Lösungen finden, aber erfüllt mich nicht ganz.

Was passiert, wenn die Binärbibliothek nicht mit einem Paket für Debugging-Symbole geliefert wird? Was passiert, wenn das Programm in Laufzeit-generierten Code springt?

Das Zerlegen des Codes ist auch keine wirkliche Lösung, da die Benutzeroberfläche dies ignoriert, vor allem werden die Werte der Register nicht aktualisiert, bis Sie zum ursprünglichen bekannten Code zurückkehren. info registers funktioniert, aber das ist kaum interaktiv.

Irgendwelche Vorschläge?

Danke!

Antwort

8

Das können Sie mit dem Befehl display tun.

display/i $pc wird die aktuelle Anweisung zerlegen, bevor nur die Aufforderung jedes Mal gedruckt wird:

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

nun eine Anweisung Schritt (dann einfach weiter wiederholen Enter drücken):

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

Es ist immer noch funktioniert wenn wir zu diesem Punkt kommen:

(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 

Mehr als ein display Ausdruck kann sofort aktiv sein (verwenden Sie undisplay <number>, um sie zu entfernen). Zum Beispiel, um zu sehen, was passiert mit %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 

... und hier die Änderung in %eax zu sehen:

(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

besser als die Alternative, aber es mit der TUI nicht funktioniert auf . Ich werde dies immer noch als die akzeptierte Antwort nach einer Weile markieren, da mir klar ist, dass es keine wirkliche Lösung geben wird. – jbcreix