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!
Antwort
Zu viele Anzeigen?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