Verwenden von gdb zum Konvertieren von Adressen in Zeilen

Lesezeit: 4 Minuten

Allans Benutzeravatar
Allan

Ich habe einen Stack-Trace, der von einer entfernten Anwendung generiert wird und folgendermaßen aussieht:

 *** Check failure stack trace: ***
    @     0x7f0e442d392d  (unknown)
    @     0x7f0e442d7b1f  (unknown)
    @     0x7f0e442d7067  (unknown)
    @     0x7f0e442d801d  (unknown)
    @     0x7f0e457c55e6  (unknown)
    @     0x7f0e457c5696  (unknown)
    @           0x4e8765  (unknown)
    @           0x4a8b43  (unknown)
    @     0x7f0e43197ced  (unknown)
    @           0x4a6889  (unknown)

Und ich habe eine nicht gestrippte Version der ausführbaren Datei und aller ihrer Bibliotheken (kompiliert mit Debug-Informationen). Aber wie kann ich die Adresse in Dateien und Zeilennummern übersetzen??

Folgendes habe ich versucht:

gdb
set solib-absolute-prefix /path/to/non-stripped/edition/of/root/filesystem/sysroot/
file /path/to/non-stripped/edition/of/root/filesystem/sysroot/usr/bin/my-buggy-app
info line *0x7f0e457c5696

Wenn ich den Dateibefehl eingebe, werden nur Symbole aus der Datei geladen, nicht alle verwendeten Bibliotheken. Gibt es eine Möglichkeit, dies zu tun?

Der Befehl “info line” sagt:

Für die Adresse 0x7f0e442d801d sind keine Zeilennummerninformationen verfügbar

Ich nehme an, dass sich die Adresse in einer der gemeinsam genutzten Bibliotheken befindet, aber wie kann ich wissen, in welcher von ihnen?

  • addr2line ?

    – ein weiterer.anon.Feigling

    17. Dezember 2011 um 16:10 Uhr

  • @another.anon.coward Jahr, das habe ich versucht, aber ich weiß nicht, in welcher Datei ich suchen soll, da die Adressen auf gemeinsam genutzte Bibliotheken zeigen.

    – Allan

    17. Dezember 2011 um 17:24 Uhr

  • @Allan: Sie können verwenden info sharedlibrary Befehl, um zu erfahren, welche gemeinsam genutzte Bibliothek die Adressen enthält 0x7f0e442d801d gehört.

    – ks1322

    17. Dezember 2011 um 19:00 Uhr


  • Nicht ausprobiert, aber add-symbol-file filename address könnte möglicherweise helfen, Symbole aus gemeinsam genutzten Bibliotheken (eins nach dem anderen) zu laden. delorie.com/gnu/docs/gdb/gdb_125.html

    – thomasa88

    2. Januar 2015 um 18:50 Uhr

  • Habe eine Bibliothek ohne Symbole gefunden sharedlibrary und list 0xaddress keine Quelle angegeben. Ich rannte add-symbol-file file addr und dann list 0xaddress Quellcode gezeigt.

    – thomasa88

    2. Januar 2015 um 18:57 Uhr

Benutzeravatar von whitey04
whitey04

Laut OP lautet der Befehl in GDB zum Suchen der Quellcodezeile von einer Adresse:

info line *0x10045740

Bearbeiten: “Infosymbol 0x10045740” ersetzt, das unter bestimmten Bedingungen nicht funktioniert (danke @Thomasa88).

  • Dies zeigt nur das Symbol + Offset (LftPlugin::import_clicked() const + 1522 in section .text of /home/thomas/.kde4/lib64/kde4/kmm_lft.so), während info line *0xabc zeigt die Zeilennummer (Line 97 of "plugin/lft_plugin.cpp" starts at address 0x7fffe49eb39c <LftPlugin::import_clicked() const+1522> and ends at 0x7fffe49eb3ad <LftPlugin::import_clicked() const+1539>.). In meinem Fall wird meine Shared Library zwar nicht gestrippt, aber add-symbol-file filename address könnte eventuell helfen, wenn die Symbole abgestreift werden. delorie.com/gnu/docs/gdb/gdb_125.html

    – thomasa88

    2. Januar 2015 um 18:47 Uhr

  • wie macht man das im mi modus?

    – Exebook

    4. April 2021 um 9:35 Uhr

Benutzeravatar des beschäftigten Russen
Angestellter Russe

Aber wie kann ich die Adresse in Dateien und Zeilennummern übersetzen?

Für die ausführbare Hauptdatei (Adressen wie 0x4e8765) mach das:

addr2line -e /path/to/non-stripped/.../my-buggy-app \
    0x4a6889 0x4a8b43 0x4e8765

Eigentlich möchten Sie vielleicht subtrahieren 5 (übliche Länge der CALL Anleitung) von allen oben genannten Adressen.

Für die Adressen in gemeinsam genutzten Bibliotheken müssen Sie die Ladeadresse der Bibliothek kennen.

Wenn Ihre Bewerbung a core Datei, dann (gdb) info shared wird Ihnen sagen, wo Bibliotheken geladen wurden.

Wenn Sie keine Kerndatei erhalten haben und die Anwendung die erforderliche Zuordnung nicht gedruckt hat, dann

  • Sie sollten die Anwendung so reparieren, dass sie diese Informationen druckt (der Stack-Trace ist ohne sie meistens nutzlos) und
  • Sie könnten noch raten: Schauen Sie sich den Code in der ausführbaren Datei an 0x4e8760 – Es sollte ein sein CALL Anweisung zu irgendeiner Funktion. Finden Sie nun heraus, in welcher Bibliothek sich diese Funktion befindet, und finden Sie ihre Adresse in der Bibliothek (via nm). Wenn Sie Glück haben, ist diese Adresse in der Nähe 0xNc56NN. Sie können jetzt die Ladeadresse der jeweiligen Bibliothek erraten 0x7f0e457NNNNNN. Wiederholen Sie für 0x7f0e457c55e1und Sie können die Ladeadresse der Bibliothek unter herausfinden 0x7f0e442dNNNN.

  • Ich bin hergekommen, weil addr2line funktioniert nicht immer, während GDB felsenfest ist.

    – Exebook

    4. April 2021 um 9:27 Uhr

1401050cookie-checkVerwenden von gdb zum Konvertieren von Adressen in Zeilen

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

Privacy policy