So laden Sie mehrere Symboldateien in gdb
. Ich habe eine ausführbare Datei foo.out und lade ein Modul bar.so. Ich habe zwei Symboldateien foo.symbol und bar.symbol erstellt. Wie man beide Dateien in gdb lädt.
# gdb --core core
# (gdb)
# (gdb) symbol-file foo.symbol
So laden Sie die zweite Symboldatei. Oder gibt es eine Möglichkeit, alle Dateien des Verzeichnisses in gdb
zu laden
Um das Verzeichnis mit der Symboldatei festzulegen, verwenden Sie
set debug-file-directory <directory>
und verwenden
show debug-file-directory
um anzuzeigen, was momentan als Verzeichnis mit Symboldateien festgelegt ist.
Symboldateien werden automatisch aus diesem Verzeichnis gelesen, wenn ihr Name (ohne Pfad) von der Binärdatei als Debug-Link angegeben wird.
Um zusätzliche Symbole hinzuzufügen, können Sie add-symbol-file
verwenden.
(als gdb onlinedocs scheint im Moment nicht verfügbar zu sein, wenn ich das hier zitiere)
add-symbol-file Dateiname
add-symbol-file Dateiname Adresse [-readnow] [-mapped]
add-symbol-dateiname -sektion adresse ...
Der Befehl add-symbol-file liest zusätzliche Symboltabelleninformationen aus dem Dateinamen. Sie würden diesen Befehl verwenden, wenn der Dateiname dynamisch (auf andere Weise) in das laufende Programm geladen wurde. Adresse sollte die Speicheradresse sein, an der die Datei geladen wurde; gdb kann das nicht für sich selbst herausfinden. Sie können zusätzlich eine beliebige Anzahl von '-section address' Paaren angeben, um einen expliziten Abschnittsnamen und eine Basisadresse für diesen Abschnitt anzugeben. Sie können eine beliebige Adresse als Ausdruck angeben.
Die Symboltabelle der Datei Dateiname wird der Symboltabelle hinzugefügt, die ursprünglich mit dem Befehl symbol-file gelesen wurde. Sie können den Befehl add-symbol-file beliebig oft verwenden. Die neuen gelesenen Symboldaten werden immer älter. Um alle alten Symboldaten zu verwerfen, verwenden Sie den Befehl symbol-file ohne Argumente.
Obwohl Dateiname normalerweise eine gemeinsam genutzte Bibliotheksdatei, eine ausführbare Datei oder eine andere Objektdatei ist, die zum Laden vollständig in einen Prozess verschoben wurde, können Sie auch symbolische Informationen aus verschiebbaren .o-Dateien laden, sofern:
- die symbolischen Informationen der Datei beziehen sich nur auf Linkersymbole, die in dieser Datei definiert sind, nicht auf Symbole, die von anderen Objektdateien definiert werden.
- jeder Abschnitt, auf den sich die symbolischen Informationen der Datei beziehen, wurde tatsächlich in den unteren Bereich geladen, wie er in der Datei erscheint, und
- sie können die Adresse bestimmen, unter der jeder Abschnitt geladen wurde, und diese dem Befehl add-symbol-file zur Verfügung stellen.
Einige eingebettete Betriebssysteme wie Sun Chorus und VxWorks können verlagerbare Dateien in ein bereits ausgeführtes Programm laden. Solche Systeme machen typischerweise die oben genannten Anforderungen leicht zu erfüllen. Es ist jedoch wichtig zu wissen, dass viele systemeigene Systeme komplexe Verknüpfungsprozeduren verwenden (z. B. .Linkonce-Abschnitts-Factoring und C++ - Konstruktortabelle), die die Erfüllung der Anforderungen erschweren. Im Allgemeinen kann nicht davon ausgegangen werden, dass die Verwendung der Add-Symbol-Datei zum Lesen der symbolischen Informationen einer verschiebbaren Objektdatei den gleichen Effekt hat wie das Verknüpfen der verschiebbaren Objektdatei auf normale Weise mit dem Programm.
die Add-Symbol-Datei wird nicht wiederholt, wenn Sie nach der Verwendung drücken.
Sie können die Optionen
-mapped' and
- readnow 'genauso wie mit dem Befehl symbol-file verwenden, um zu ändern, wie gdb die Symboltabelleninformationen für Dateiname verwaltet.
Neben der Antwort und den Kommentaren des Alk ist die angefragte Adresse die Adresse des .text
-Abschnitts ..__, die Sie mit dem Befehl readelf
finden können
Hier haben Sie ein Beispiel für eine readelf
-Verwendung für Binärdateien Die Adresse, an der Dateiname geladen wurde, fehlt [GDB]
Zusätzliche Symbole können in die Debugsitzung gdb
geladen werden mit:
add-symbol-file filename address
Der Parameter address
ist die Adresse für den Abschnitt .text
. Diese Adresse kann abgerufen werden mit:
readelf -WS path/to/file.elf | grep .text | awk '{ print "0x"$5 }'
Dies kann in gdb
automatisiert werden, indem folgender Eintrag zu ~/.gdbinit
Hinzugefügt wird:
define add-symbol-file-auto
# Parse .text address to temp file
Shell echo set \$text_address=$(readelf -WS $arg0 | grep .text | awk '{ print "0x"$5 }') >/tmp/temp_gdb_text_address.txt
# Source .text address
source /tmp/temp_gdb_text_address.txt
# Clean tempfile
Shell rm -f /tmp/temp_gdb_text_address.txt
# Load symbol table
add-symbol-file $arg0 $text_address
end
Nach der obigen Funktionsdefinition kann add-symbol-file-auto
Verwendet werden, um zusätzliche Symbole zu laden:
(gdb) add-symbol-file-auto path/to/1.elf
add symbol table from file "path/to/1.elf" at
.text_addr = 0x8010400
(gdb) add-symbol-file-auto path/to/2.elf
add symbol table from file "path/to/2.elf" at
.text_addr = 0x8000000
(gdb) break main
Breakpoint 1 at 0x8006cb0: main. (2 locations)
(gdb) info break
Num Type Disp Enb Address What
1 breakpoint keep y <MULTIPLE>
1.1 y 0x08006cb0 in main() at ./source/main.cpp:114
1.2 y 0x080106a6 in main() at ./main.cpp:10
(gdb)
Anstatt zu versuchen, Symbole manuell in die richtige Position zu laden, habe ich es für zweckmäßiger gefunden, die Symbole wieder zu den entfernten ausführbaren Dateien zusammenzuführen mit eu-unstrip
und dann den Absturz mit bereits vorhandenen Symbolen zu reproduzieren.
Dieser Ansatz hängt nicht von Symboldateien ab, die dem Namensschema entsprechen, das von den Pfadauflösungsmechanismen (debug link und build id) benötigt wird, die verwendet werden, wenn Sie debug-file-directory
einstellen.
add-symbol-file filename address
add-symbol-file filename address [ -readnow ] [ -mapped ]
add-symbol-file filename -ssection address ...