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?
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).
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 0x7f0e457c55e1
und Sie können die Ladeadresse der Bibliothek unter herausfinden 0x7f0e442dNNNN
.
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ält0x7f0e442d801d
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
undlist 0xaddress
keine Quelle angegeben. Ich rannteadd-symbol-file file addr
und dannlist 0xaddress
Quellcode gezeigt.– thomasa88
2. Januar 2015 um 18:57 Uhr