Wie man gdb Symbole drucken in gemeinsamen Bibliotheken geladen mit dlopen?
Möchte ich eine debug-Prozess auf Linux 2.6 mit GDB. attach PID
(wobei PID die Prozess-ID), print main
, print sin
, print gzopen
und print dlopen
arbeiten (d.h. Sie finden die entsprechenden Symbole). Aber print myfoo
funktioniert nicht, wo myfoo
ist eine Funktion geladen, die durch den Prozess von einem .so
- Datei mit dlopen
. Hier ist, was ich bekomme:
(gdb) print main
$3 = {int (int, char **)} 0x805ba90 <main>
(gdb) print sin
$4 = {<text variable, no debug info>} 0xb7701230 <sin>
(gdb) print gzopen
$5 = {<text variable, no debug info>} 0xb720df50 <gzopen>
(gdb) print dlopen
$6 = {<text variable, no debug info>} 0xb77248e0 <__dlopen_nocheck>
(gdb) print myfoo
No symbol "myfoo" in current context.
Wie bekomme ich den GDB zu finden myfoo
?
Die Funktion myfoo
ist, existiert tatsächlich, denn in dem Programm habe ich es geschafft, seine Adresse mit dlsym
(nach dlopen
), und ich es geschafft, es zu nennen. Erst danach befestigte ich den GDB an den Prozess.
Es stellte sich heraus, dass es ein mydir/mylib.so: No such file or directory
Fehlermeldung gedruckt von der attach $PID
Befehl von GDB. Offenbar GDB gestartet wurde in das falsche Verzeichnis. Weise die richtige cd
vor Beginn der GDB das problem behoben, und print myfoo
zu arbeiten begonnen.
Ich würde gerne, dies zu automatisieren: ich möchte GDB herausfinden, wo meine .so
Dateien (geladen mit dlopen
) sind. Eine Annäherung ich denken kann, ist die Prüfung /proc/$PID/maps
(auf Linux), Suche nach möglichen Verzeichnisse, und das hinzufügen Sie alle auf den GDB-library search path", bevor GDB. Erweiterung LD_LIBRARY_PATH
und dabei eine set solib-search-path /tmp/parent
hat nicht funktioniert (ls -l /tmp/parent/mydir/myfoo.so
funktioniert), GDB noch berichtet die No such file or directory
. Wie kann ich feststellen, GDB, wo mydir/myfoo.so
?
Meine andere Frage ist, wie bekomme ich die Liste der möglichen Verzeichnisse? Unter Linux /proc/$PID/maps
Sie enthält-aber was ist mit anderen Betriebssystemen wie FreeBSD und Mac OS X?
- Funktioniert gut für mich. Post code. Was flags sind Sie vorbei
dlopen
? - Hmm, Browsen durch die GDB-Fehlermeldungen beim anbringen habe ich festgestellt
mylib.so: No such file or directory
. Nachdem ich die richtigecd
vor Beginn der GDBprint myfoo
zu arbeiten begonnen. Aber ich würde gerne automatisieren, dass (socd
ist nicht erforderlich). Ich habe erweiterte die Frage.
Du musst angemeldet sein, um einen Kommentar abzugeben.
"info " target" - Befehl in der gdb wird eine Liste aller Abteilungen in allen geladenen shared objects (einschließlich dlopen()ed Bibliotheken). Zumindest das funktioniert auf Linux-ich weiß nicht, wie verhält es sich auf anderen Betriebssystemen.
Ich behaupte, dass ein Programm lädt eine gemeinsam genutzte Bibliothek via dlopen() und haben erfolgreich erreicht, die Symbole in der gemeinsam genutzten Bibliothek mit GDB. Dies wird jedoch nur dann möglich, wenn die gemeinsam genutzte Bibliothek hat eine symbol-Tabelle.
Wie es aussieht gibt es keine einfache Möglichkeit, zu automatisieren, zu finden zu finden
.so
Dateien im GDB.