10 Stimmen

Wie finden Sie die Speicheradresse einer Funktion mit lldb?

In GDB kann ich "info line func_name" verwenden, um die Speicheradresse von func_name zu erhalten, und dann "set $PC=memory_address" verwenden, um mit dem Debuggen dieser Funktion zu beginnen. Wie mache ich das Gleiche innerhalb von lldb? Vielen Dank im Voraus!

20voto

Jason Molenda Punkte 14315

Der Befehl in lldb lautet "image lookup". Ich denke, ein Beispiel für "info func" <-> "image lookup" wurde kürzlich zur lldb/gdb-Befehlsseite hinzugefügt - http://lldb.llvm.org/lldb-gdb.html

z.B.

(lldb) im loo -n puts
1 Treffer in /usr/lib/system/libsystem_c.dylib gefunden:
        Adresse: libsystem_c.dylib[0x0000000000011d9a] (libsystem_c.dylib.__TEXT.__text + 69850)
        Zusammenfassung: libsystem_c.dylib`puts
(lldb) 

auch wenn hier nur der Offset in libsystem_c.dylib angezeigt wird (0x11d9a) - um die tatsächliche Speicheradresse zu sehen, müssten Sie die Option "-v" für image lookup verwenden, die den Bereich von Adressen zeigt, den puts abdeckt. Oder Sie könnten dies direkt mit der Back-Tick-Notation in lldb tun,

(lldb) reg read pc
     rip = 0x0000000100000f2b  a.out`main + 11 bei a.c:3
(lldb) reg write pc `(void(*)())puts`
(lldb) reg read pc
     rip = 0x00007fff99ce1d9a  libsystem_c.dylib`puts

OK, ich musste puts() casten, weil lldb hier einen Funktionsprototyp benötigte - nicht sehr praktisch, aber wenn es sich um eine Ihrer eigenen Funktionen handelt, die nicht benötigt wird:

(lldb) reg write pc `main`
(lldb) reg read pc
     rip = 0x0000000100000f20  a.out`main bei a.c:2

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X