Wie prepend ich ein Verzeichnis der Bibliothek Pfad, wenn eine Core-Datei in GDB auf Linux Laden

StackOverflow https://stackoverflow.com/questions/84341

  •  01-07-2019
  •  | 
  •  

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?

War es hilfreich?

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öchten   solib-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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top