Ich möchte einen Prozess debuggen, der unter Linux 2.6 mit GDB läuft. attach PID
(wobei PID die Prozess-ID ist), print main
, print sin
, print gzopen
und print dlopen
work (d. h. sie finden die entsprechenden Symbole). Aber print myfoo
funktioniert nicht, wobei myfoo
eine Funktion ist, die vom Prozess aus einer .so
-Datei mit dlopen
geladen wird. Hier ist, was ich bekomme:
Wie bekomme ich GDB, um myfoo
zu finden?
Die Funktion myfoo
existiert tatsächlich, weil ich im Programm die Adresse mit dlsym
(nach dlopen
) bekommen habe und es geschafft habe, sie aufzurufen. Erst danach habe ich GDB an den Prozess angehängt.
Es stellte sich heraus, dass eine Fehlermeldung mydir/mylib.so: No such file or directory
mit dem Befehl attach $PID
von GDB ausgegeben wurde. Anscheinend wurde GDB im falschen Verzeichnis gestartet. Das richtige cd
vor dem Start von GDB zu tun, behob das Problem und print myfoo
funktionierte.
Ich möchte das automatisieren: Ich möchte GDB herausfinden, wo meine .so
Dateien (geladen mit dlopen
) sind. Eine Annäherung, die ich mir vorstellen kann, ist die Untersuchung von /proc/$PID/maps
(unter Linux), das Auffinden von möglichen Verzeichnissen und das Hinzufügen aller von ihnen zum Suchpfad der GDB-Bibliothek, bevor GDB gestartet wird. Das Erweitern von LD_LIBRARY_PATH
und das Ausführen von set solib-search-path /tmp/parent
funktionierte nicht ( ls -l /tmp/parent/mydir/myfoo.so
funktioniert), GDB meldete immer noch No such file or directory
. Wie sage ich GDB, wo nach mydir/myfoo.so
gesucht wird?
Meine andere Frage ist, wie bekomme ich die Liste der möglichen Verzeichnisse? Unter Linux enthält /proc/$PID/maps
sie - aber was ist mit anderen Betriebssystemen wie FreeBSD und Mac OS X?
"info target" -Befehl in gdb zeigt eine Liste aller Abschnitte in allen geladenen geteilten Objekten (einschließlich dlopen () ed-Bibliotheken). Zumindest funktioniert das unter Linux - ich weiß nicht, wie es sich auf anderen Betriebssystemen verhält.
Ich führe ein Programm, das über dlopen () eine shared library lädt und mit GDB erfolgreich auf Symbole in der shared library zugegriffen hat. Dies funktioniert jedoch nur, wenn die gemeinsame Bibliothek eine Symboltabelle hat.
Tags und Links linux shared-libraries gdb