Frage

in Linux und Mac OS X Ich kann stepi und WEITERi verwenden, um eine Anwendung zu debuggen, ohne Debug-Informationen.

Unter Mac OS X gdb zeigt die Funktionen, die in der Bibliothek aufgerufen werden, wenn auch manchmal mehrere Assembler-Anweisungen in jeder stepi Anweisung voran.

Unter Linux, wenn ich in eine dynamische Bibliothek gdb Schritt verloren. Zum Beispiel mit puts () gibt es drei Assembler-Anweisungen innerhalb puts (), sobald gdb den Sprung in 0x080482bf erreicht hat, schlägt es mit der Meldung „Keine Funktion enthält Programmzähler für ausgewählte Rahmen“.

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

Möchten Sie wissen, wie diese Bibliothek Anrufe debuggen mit gdb.

War es hilfreich?

Lösung

Wenn GDB nicht Debug-Symbole für die Funktion haben Sie versuchen, zu debuggen, wird GDB nicht möglich sein, den Bereich von Speicheradressen zu zerlegen zu bestimmen. Um dies zu umgehen, können Sie den Bereich in den disassemble Befehl übergeben. Zum Beispiel:

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

Es kann ein Weg sein, Debug-Symbole zu installieren. Auf meinem Ubuntu-System installierte ich das Paket libc6-dbg, die mich in Funktionen in der Standardbibliothek zu Schritt ermöglicht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top