So laden Sie mehrere Symboldateien in gdb

Lesezeit: 8 Minuten

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. So laden Sie beide Dateien in gdb.

# 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 zu laden gdb

Benutzeravatar von alk
alk

Um das Verzeichnis festzulegen, das die Symboldatei enthält, verwenden Sie

set debug-file-directory <directory>

und verwenden

show debug-file-directory

um anzuzeigen, was derzeit als Verzeichnis mit Symboldateien festgelegt ist.

Symboldateien werden automatisch aus diesem Verzeichnis gelesen, wenn ihr Name (ohne Pfad) von der Binärdatei im Sinne eines Debug-Links bereitgestellt wird.


Um zusätzliche Symbole hinzuzufügen, die Sie verwenden könnten add-symbol-file.

(als die gdb onlinedocs scheinen im Moment nicht verfügbar zu sein, ich zitiere dies hier)

add-symbol-file Dateiname Adresse

add-symbol-file Dateiname Adresse [ -readnow ] [ -mapped ]

add-symbol-file Dateiname -Abschnitt Adresse …

Der Befehl add-symbol-file liest zusätzliche Symboltabelleninformationen aus der Datei filename. Sie würden diesen Befehl verwenden, wenn Dateiname dynamisch (auf andere Weise) in das laufende Programm geladen wurde. Adresse sollte die Speicheradresse sein, an der die Datei geladen wurde; gdb kann dies nicht 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 filename wird zu 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 so gelesenen neuen Symboldaten werden weiter zu den alten hinzugefügt. Um stattdessen 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 in einen Prozess vollständig verschoben wurde, können Sie auch symbolische Informationen aus verschiebbaren .o-Dateien laden, solange:

  • Die symbolischen Informationen der Datei beziehen sich nur auf Linker-Symbole, 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 die untergeordnete Datei geladen, wie sie in der Datei erscheint, und
  • Sie können die Adresse ermitteln, an 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 verschiebbare Dateien in ein bereits laufendes Programm laden; solche Systeme machen es typischerweise einfach, die oben genannten Anforderungen zu erfüllen. Es ist jedoch wichtig zu erkennen, dass viele native Systeme komplexe Link-Prozeduren verwenden (z. B. .linkonce-Abschnittsfaktorisierung und C++-Konstruktortabellenassemblierung), die die Erfüllung der Anforderungen erschweren. Im Allgemeinen kann man nicht davon ausgehen, dass die Verwendung von add-symbol-file zum Lesen der symbolischen Informationen einer verschiebbaren Objektdatei denselben Effekt hat wie das normale Verknüpfen der verschiebbaren Objektdatei mit dem Programm.

add-symbol-file wird nicht wiederholt, wenn Sie nach der Verwendung drücken.

Du kannst den … benutzen -mapped' and-readnow’-Optionen wie beim symbol-file-Befehl, um zu ändern, wie gdb die Symboltabelleninformationen für filename verwaltet.

  • Ich habe das versucht, aber es lädt die Symboldateien nicht aus diesem Verzeichnis

    – Ibrar Ahmed

    4. Dezember 2013 um 18:33 Uhr

  • Lädst du bar.so dynamisch? Enthält es einen Debug-Link?

    – alk

    4. Dezember 2013 um 18:36 Uhr


  • Ja bar.so verlinkt dynamisch und enthält keine Symbole. Ich habe eine Symboldatei von bar.symbol

    – Ibrar Ahmed

    4. Dezember 2013 um 19:05 Uhr

  • gdb kann die Adresse nicht herausfinden, wie kann ich die Adresse erfahren?

    – Ibrar Ahmed

    5. Dezember 2013 um 8:47 Uhr

  • In meinem Fall suchte gdb nicht in dem auf debug-file-directory gesetzten Verzeichnis selbst, sondern in einem Unterverzeichnis, das der absolute Pfad zur Originaldatei (bar.so) ist.

    – Alex Che

    23. April 2019 um 18:15 Uhr

Jaakkos Benutzeravatar
Jaakko

Zusätzliche Symbole können in die geladen werden gdb Debug-Sitzung mit:

add-symbol-file filename address

Parameter address ist die Adresse für .text Sektion. Diese Adresse kann abgerufen werden mit:

readelf -WS path/to/file.elf | grep .text | awk '{ print "0x"$5 }'

Dies kann automatisiert werden gdb durch Hinzufügen des folgenden Eintrags zu ~/.gdbinit:

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 obiger Funktionsdefinition add-symbol-file-auto kann verwendet werden zusätzliche Symbole laden:

(gdb) add-symbol-file-auto path/to/bootloader.elf
add symbol table from file "path/to/bootloader.elf" at
    .text_addr = 0x8010400
(gdb) add-symbol-file-auto path/to/application.elf
add symbol table from file "path/to/application.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)

  • Hier ist eine Version von add-symbol-file-auto das hängt nicht von einer temporären Datei ab: stackoverflow.com/questions/20380204/…

    – Rob W

    19. Juni 2020 um 13:20 Uhr

Oliviers Benutzeravatar
Olivier

Zusätzlich zur Antwort des alk und seinen Kommentaren ist die gefragte Adresse die Adresse des .text Sektion. Sie können es finden, indem Sie die verwenden readelf Befehl

Hier haben Sie ein Beispiel für a readelf Verwendung für Binärdateien Die Adresse, an der Dateiname geladen wurde, fehlt [GDB]

Benutzeravatar von Rob W
Rob W

add-symbol-file-auto von Jaakkos Antwort beruht auf dem Schreiben in eine externe Datei. Dies kann zu Problemen führen, wenn die Datei nicht gelesen oder geschrieben werden kann. Hier ist eine Implementierung, die die gleiche Funktionalität bietet, unter Verwendung von a In Python definierter GDB-Befehl. Fügen Sie dies zu Ihrem hinzu .gdbinit:

python
# Note: Replace "readelf" with path to binary if it is not in your PATH.
READELF_BINARY = 'readelf'

class AddSymbolFileAuto (gdb.Command):
    """Load symbols from FILE, assuming FILE has been dynamically loaded (auto-address).
Usage: add-symbol-file-auto FILE [-readnow | -readnever]
The necessary starting address of the file's text is resolved by 'readelf'."""
    def __init__(self):
        super(AddSymbolFileAuto, self).__init__("add-symbol-file-auto", gdb.COMMAND_FILES)

    def invoke(self, solibpath, from_tty):
        from os import path
        self.dont_repeat()
        if os.path.exists(solibpath) == False:
            print ("{0}: No such file or directory." .format(solibpath))
            return
        offset = self.get_text_offset(solibpath)
        gdb_cmd = "add-symbol-file %s %s" % (solibpath, offset)
        gdb.execute(gdb_cmd, from_tty)

    def get_text_offset(self, solibpath):
        import subprocess
        elfres = subprocess.check_output([READELF_BINARY, "-WS", solibpath])
        for line in elfres.splitlines():
            if "] .text " in line:
                return "0x" + line.split()[4]
        return ""  # TODO: Raise error when offset is not found?

    def complete(self, text, word):
        return gdb.COMPLETE_FILENAME

AddSymbolFileAuto()
end

Anwendungsbeispiel:

add-symbol-file-auto foo.symbol

Beachten Sie, dass lediglich die Symbole mit geladen werden add-symbol-file kann Ihnen erlauben, Breakpoints zu setzen, aber das bedeutet nicht automatisch, dass Sie etwas Sinnvolles damit machen können, wie z. B. den Breakpoint tatsächlich auszulösen. Verwenden info sharedlibrary (oder info shared), um zu überprüfen, ob die Symbole tatsächlich für das Debugziel relevant sind (optional mit einem Muster, um bestimmte Ergebnisse statt aller anzuzeigen). Es sollte so aussehen:

(gdb) gdb-symbol-file-auto path/to/library.symbols
(gdb) info shared symbol-file
From        To          Syms Read   Shared Object Library
0x0000abc0  0x0000def0  Yes         path/to/library

Folgendes wird angezeigt, wenn die geladenen Symbole nicht verwendet werden:

From        To          Syms Read   Shared Object Library
0x0000abc0  0x0000def0  Yes (*)     path/to/library
(*): Shared library is missing debugging information.

Folgendes wird angezeigt, wenn GDB die Bibliothek überhaupt nicht laden kann (z. B. wenn GDB einen Fehler hat):

From        To          Syms Read   Shared Object Library
0x0000abc0  0x0000def0  No          path/to/library

Anstatt zu versuchen, Symbole manuell an die richtige Stelle zu laden, fand ich es bequemer, die Symbole wieder mit den entfernten ausführbaren Dateien zusammenzuführen eu-unstrip und dann den Absturz mit bereits vorhandenen Symbolen reproduzieren.

Dieser Ansatz hängt nicht davon ab, dass Symboldateien dem Benennungsschema entsprechen, das von den Pfadauflösungsmechanismen (Debug-Link und Build-ID), die beim Einstellen verwendet werden debug-file-directory.

Benutzeravatar von Rahul Sreeram
Rahul Sreeram

Beim Debuggen von Kerndateien habe ich festgestellt, dass die mit readelf erhaltene Adresse (wie in anderen Antworten hier erwähnt) die Symboldateien für gemeinsam genutzte Bibliotheken nicht richtig lädt, wenn add-symbol-file Befehl verwendet wird.

Ich musste stattdessen die ‘Aus‘ im Befehl angezeigte Adresse info sharedlibrary/ info shared <libname>:

(gdb) info shared libcore
From        To          Syms Read   Shared Object Library
0x0f24caa0  0x0f41c280  Yes (*)     /lib/libcore.so

Nachdem ich diese Adresse verwendet und die Symboldatei geladen hatte, konnte ich die Zeilennummern richtig abrufen.

(gdb) add-symbol-file libcore.so.debug 0x0f24caa0
add symbol table from file "libcore.so.debug" at
    .text_addr = 0xf24caa0
(y or n) y
Reading symbols from libcore.so.debug...

Ich habe diese Lösung gefunden, nachdem ich diese Seite gelesen habe: Erstellen und Verwenden von Debug-Symboltabellen mit CMake und GDB

Benutzeravatar von Floern
Floern

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

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

1400800cookie-checkSo laden Sie mehrere Symboldateien in gdb

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy