Wie prepend ich ein Verzeichnis der Bibliothek Pfad, wenn eine Core-Datei in GDB auf Linux Laden
Frage
Ich habe eine Core-Datei auf einem entfernten System erzeugt, das ich habe keinen direkten Zugriff zu. Ich habe auch lokale Kopien der Bibliotheksdateien aus dem Remote-System, und die ausführbare Datei für den Absturz Programm.
Ich mag dieses Core-Dump in gdb analysieren.
Zum Beispiel:
gdb path/to/executable path/to/corefile
Meine Bibliotheken sind im aktuellen Verzeichnis.
In der Vergangenheit habe ich Debugger dies, indem Sie die Option implementieren gesehen „-p“. oder "-p / ="; so meine Frage ist:
Wie kann ich festlegen, dass Bibliotheken zuerst von Pfaden relativ zu meinem aktuellen Verzeichnis geladen werden, wenn eine corefile in gdb Analyse?
Lösung
gdb starten, ohne dass die ausführbare Datei oder Kerndatei angeben, geben Sie die folgenden Befehle ein:
set solib-absolute-prefix ./usr
file path/to/executable
core-file path/to/corefile
Sie müssen sicherstellen, dass Ihre Bibliothek Pfad spiegeln genau aus dem Zielsystem. Das obige wird für das Debuggen Ziele gemeint, die nicht Ihren Host übereinstimmen, deshalb ist es wichtig, Ihr Root-Dateisystem-Struktur enthält die Bibliotheken zu replizieren.
Wenn Sie Remote-debuggen einen Server, der die gleiche Architektur und Linux / glibc Version als Gastgeber, dann können Sie tun, als fd vorgeschlagen:
set solib-search-path <path>
Wenn Sie versuchen, einige der Bibliotheken außer Kraft zu setzen, aber nicht alle, dann können Sie die Zielbibliothek Verzeichnisstruktur in eine temporäre Stelle kopieren und die solib-absolute-prefix
oben beschriebene Lösung verwendet werden.
Andere Tipps
Ich bin mir nicht sicher, dass dies möglich ist, alle innerhalb von gdb, aber dann bin ich kein Experte.
Allerdings kann ich kommentieren die Linux dynamische Linker. Die folgende Beschreibung ist der Weg aller aufgelöst gemeinsam genutzte Bibliotheken und die ungelösten diejenigen drucken.
ldd path/to/executable
Wir müssen wissen, wie Sie Ihre gemeinsam genutzte Bibliotheken mit ausführbaren verbunden waren. Um dies zu tun, verwenden Sie den folgenden Befehl ein:
readelf -d path/to/executable | grep RPATH
-
Sollte der Befehl Druck nichts, wird der dynamische Linker Standard Standorte verwenden und die Umgebungsvariable LD_LIBRARY_PATH die gemeinsam genutzten Bibliotheken zu finden.
-
Wenn der Befehl druckt einige Zeilen, wird der dynamische Linker LD_LIBRARY_PATH ignorieren und fest einprogrammierte rpaths stattdessen verwenden.
Wenn die aufgeführten rpaths absolut sind, ist die einzige Lösung, die ich weiß, ist, zu kopieren (oder Symlink) Ihre Bibliotheken an den genannten Standorten.
Wenn die aufgeführten rpaths relativ sind, werden sie einen $ ORIGIN enthalten, die durch den Pfad der ausführbaren Datei während der Laufzeit ersetzt werden. Bewegen Sie entweder die ausführbare Datei oder die Bibliotheken entsprechen.
Für weitere Informationen, können Sie beginnen mit:
man ld.so
Ich habe diesen Auszug auf developer.apple.com
set solib-search-path path
Wenn diese Variable gesetzt ist, ist ein Weg Doppelpunkt getrennte Liste von Verzeichnissen Suche für gemeinsam genutzte Bibliotheken.
solib-search-path' is used after
solib-absolute-Vorsilbe‘fehlschlägt suchen Sie die Bibliothek, oder wenn der Pfad zu Die Bibliothek ist relativ anstelle von absolut. Wenn Sie verwenden möchtensolib-search-path' instead of
solib-absolute-Präfix‘, achten Sie darauf, Set `solib-absolute-Präfix‘ to a nonexistant Verzeichnis GDB zu verhindern von Ihrem Host-Bibliotheken zu finden.
EDIT:
Ich glaube nicht, das obige Einstellung mit prepends die Verzeichnisse ich hinzugefügt, aber es scheint sie anhängen, so Dateien von meinem aktuellen System fehlen in den Pfaden abgeholt ich hinzu. Ich denke, den solib-absolute-Präfix, um etwas Schein und das Hinzufügen von Verzeichnissen in dem solib-Suchpfad in der Reihenfolge eine vollständige Lösung könnte sein, ich brauche Einstellung.
Sie können auch einfach eingestellt LD_PRELOAD zu jeder der Bibliotheken oder LD_LIBRARY_PATH in das aktuelle Verzeichnis, wenn gdb aufgerufen wird. Dies wird nur zu Problemen führen, wenn gdb selbst versucht, eine der Bibliotheken verwenden Sie Vorbelastung.
Ein wichtiger Hinweis:
Wenn Sie eine Kreuzkompilierung tun und versuchen, mit gdb zu debuggen, dann
nachdem Sie
file ECECUTABLE_NAME
getan haben, wenn Sie sehen smth. wie:
Using host libthread_db library "/lib/libthread_db.so.1"
dann überprüfen, ob Sie für Ihr Zielsystem libthread_db haben. Ich fand eine Menge von ähnlichen Problemen im Web. Ein solches Problem nur mit nicht gelöst werden kann „solib- gesetzt“, Sie libthread_db mit Ihrem Cross-Compiler als auch zu bauen hat.