it-swarm-eu.dev

Wie füge ich einem Verzeichnis den Bibliothekspfad vor, wenn eine Kerndatei in gdb unter Linux geladen wird?

Ich habe eine Kerndatei, die auf einem Remote-System generiert wurde, auf die ich keinen direkten Zugriff habe. Ich habe auch lokale Kopien der Bibliotheksdateien vom entfernten System und die ausführbare Datei für das abstürzende Programm.

Ich möchte diesen Core Dump in gdb analysieren.

Zum Beispiel:

gdb path/to/executable path/to/corefile

Meine Bibliotheken befinden sich im aktuellen Verzeichnis.

In der Vergangenheit habe ich gesehen, wie Debugger dies implementierten, indem sie die Option "-p" lieferten. oder "-p/=."; also meine frage ist:

Wie kann ich festlegen, dass Bibliotheken bei der Analyse eines Corefiles in gdb zuerst aus Pfaden relativ zu meinem aktuellen Verzeichnis geladen werden?

25

Starten Sie gdb, ohne die ausführbare Datei oder Kerndatei anzugeben, und geben Sie dann die folgenden Befehle ein:

set solib-absolute-prefix ./usr
file path/to/executable
core-file path/to/corefile

Sie müssen sicherstellen, dass Sie Ihren Bibliothekspfad exakt vom Zielsystem aus spiegeln. Das obige ist zum Debuggen von Zielen gedacht, die nicht mit Ihrem Host übereinstimmen. Aus diesem Grund ist es wichtig, die Struktur Ihrer Root-Dateisysteme, die Ihre Bibliotheken enthält, zu replizieren.

Wenn Sie einen Server mit derselben Architektur und Linux/glibc-Version wie Ihr Host remote debuggen, können Sie Folgendes tun: fd schlug vor:

set solib-search-path <path>

Wenn Sie versuchen, einige der Bibliotheken außer Kraft zu setzen, aber nicht alle, können Sie die Verzeichnisstruktur der Zielbibliothek an einen temporären Ort kopieren und die oben beschriebene Lösung solib-absolute-prefix verwenden.

40
Drew Frezell

Ich bin nicht sicher, ob das in gdb überhaupt möglich ist, aber dann bin ich kein Experte.

Ich kann jedoch den LinuxDynamic-Linker kommentieren. Der folgende Pfad sollte den Pfad aller aufgelösten gemeinsam genutzten Bibliotheken und der nicht aufgelösten Bibliotheken ausdrucken.

ldd path/to/executable

Wir müssen wissen, wie Ihre gemeinsam genutzten Bibliotheken mit Ihrer ausführbaren Datei verknüpft waren. Verwenden Sie dazu den folgenden Befehl:

readelf -d path/to/executable | grep RPATH
  • Wenn der Befehl nichts ausgibt, verwendet der dynamische Linker Standardpositionen und die Umgebungsvariable LD_LIBRARY_PATH, um die gemeinsam genutzten Bibliotheken zu finden.

  • Wenn der Befehl einige Zeilen ausgibt, wird der dynamische Linker LD_LIBRARY_PATH ignorieren und stattdessen die fest codierten Pfadnamen verwenden.

    Wenn die aufgelisteten Pfade absolut sind, ist die einzige Lösung, die ich kenne, das Kopieren (oder Symlink) Ihrer Bibliotheken an die aufgelisteten Speicherorte.

    Wenn die aufgelisteten Pfade relativ sind, enthalten sie ein $ Origin, das zur Laufzeit durch den Pfad der ausführbaren Datei ersetzt wird. Verschieben Sie entweder die ausführbare Datei oder die Bibliotheken entsprechend.

Für weitere Informationen können Sie beginnen mit:

man ld.so
4
bltxd

Ich habe diesen Auszug auf developer.Apple.com gefunden.

set solib-search-path path

Wenn diese Variable gesetzt ist, ist path eine Durch Doppelpunkt getrennte Liste von Verzeichnissen, in der Nach gemeinsam genutzten Bibliotheken gesucht werden soll. solib-search-path' is used after solib-absolute-prefix 'schlägt fehl, [ der Bibliothek oder wenn der Pfad zu der Bibliothek relativ ist anstatt absolut. Wenn Sie solib-search-path' instead of solib-absolute-prefix 'verwenden möchten, stellen Sie sicher, dass Solib-absolute-prefix' auf ein nicht vorhandenes Verzeichnis gesetzt ist, um GDB Zu verhindern. von der Suche nach den Bibliotheken Ihres Hosts.

EDIT:

Ich denke nicht, dass die oben genannte Einstellung die von mir hinzugefügten Verzeichnisse voranstellt, aber es scheint sie anzuhängen, also werden Dateien, die in meinem aktuellen System fehlen, in den Pfaden aufgenommen, die ich hinzugefügt habe. Ich denke, das Festlegen des solib-absoluten-Präfixes auf etwas Falsches und das Hinzufügen von Verzeichnissen im solib-Suchpfad in der Reihenfolge, die ich brauche, könnte eine vollständige Lösung sein.

3

Sie können LD_PRELOAD auch einfach auf jede der Bibliotheken oder LD_LIBRARY_PATH auf das aktuelle Verzeichnis setzen, wenn Sie gdb aufrufen. Dies führt nur dann zu Problemen, wenn gdb selbst versucht, eine der Bibliotheken zu verwenden, die Sie vorab laden.

2
Joseph Garvin

Ein wichtiger Hinweis:

wenn Sie ein Cross-Compilieren durchführen und versuchen, mit gdb zu debuggen, dann , wenn Sie fertig sind 
file ECECUTABLE_NAME wenn Sie smth sehen. mögen :

Using Host libthread_db library "/lib/libthread_db.so.1"

prüfen Sie dann, ob Sie für Ihr Zielsystem libthread_db haben. Ich habe viele ähnliche Probleme im Web gefunden. Solches Problem kann nicht einfach mit "set solib-" gelöst werden, Sie müssen libthread_db auch mit Ihrem Cross-Compiler erstellen.

0
psihodelia