wake-up-neo.com

So laden Sie mehrere Symboldateien in gdb

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

24
Ibrar Ahmed

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. 

15
alk

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]

8
Olivier

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)
7
Jaakko

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.

1
the8472
add-symbol-file filename address
add-symbol-file filename address [ -readnow ] [ -mapped ]
add-symbol-file filename -ssection address ...

siehe http://www.delorie.com/gnu/docs/gdb/gdb_125.html

0
Frank Ren