Wie kann man gdb Symbole in geteilten Bibliotheken erstellen, die mit dlopen geladen sind?

8

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:

%Vor%

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?

    
pts 08.12.2010, 21:28
quelle

3 Antworten

0

Es sieht so aus, als ob es keine einfache Möglichkeit gibt, das Auffinden von .so -Dateien in GDB zu finden.

    
pts 09.09.2013, 22:47
quelle
3

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

    
Martin Ünsal 19.04.2014 00:56
quelle
0

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.

    
Jon Trauntvein 08.12.2010 21:45
quelle

Tags und Links