Hier sind zwei Alternativen für addr2line
. Angenommen, Sie haben die Toolchain des richtigen Ziels, können Sie einen der folgenden Schritte ausführen:
Verwenden Sie objdump
:
-
Suchen Sie Ihren
vmlinux
oder die.ko
Datei im Kernel-Root-Verzeichnis, dann disassemblieren Sie die Objektdatei :objdump -dS vmlinux > /tmp/kernel.s
-
Öffnen Sie die generierte Baugruppendatei
/tmp/kernel.s
. mit einem Texteditor wievim
. Gehen Sie zuunwind_backtrace+0x0/0xf8
, d. h. nach der Adresse vonunwind_backtrace
suchen + dieoffset
. Endlich haben Sie den problematischen Teil in Ihrem Quellcode gefunden.
Verwenden Sie gdb
:
IMO, eine noch elegantere Option ist die Verwendung des einzigen gdb
. Vorausgesetzt, Sie haben die passende Toolchain auf Ihrem Host-Rechner:
- Führen Sie
gdb <path-to-vmlinux>
aus . - Führen Sie im Prompt von gdb aus:
list *(unwind_backtrace+0x10)
.
Weitere Informationen finden Sie in den folgenden Ressourcen:
- Kernel-Debugging-Tricks.
- Debuggen des Linux-Kernels mit Gdb
In unwind_backtrace+0x0/0xf8
was zum +0x0/0xf8
steht für?
Die erste Zahl (+0x0
) ist der Offset vom Beginn der Funktion (unwind_backtrace
in diesem Fall). Die zweite Zahl (0xf8
) ist die Gesamtlänge der Funktion . Wenn Sie anhand dieser beiden Informationen bereits eine Vermutung darüber haben, wo der Fehler aufgetreten ist, könnte dies ausreichen, um Ihren Verdacht zu bestätigen (Sie können (ungefähr) sagen, wie weit Sie in der Funktion fortgeschritten sind).
Um die genaue Quellzeile der entsprechenden Anweisung zu erhalten (im Allgemeinen besser als Ahnung), verwenden Sie addr2line
oder die anderen Methoden in anderen Antworten.
Es ist nur ein gewöhnlicher Backtrace, diese Funktionen werden in umgekehrter Reihenfolge aufgerufen (die erste aufgerufene wurde von der vorherigen aufgerufen und so weiter):
unwind_backtrace+0x0/0xf8
warn_slowpath_common+0x50/0x60
warn_slowpath_null+0x1c/0x24
ocal_bh_enable_ip+0xa0/0xac
bdi_register+0xec/0x150
Die bdi_register+0xec/0x150
das Symbol + der Offset/die Länge ist, gibt es weitere Informationen dazu in Kernel-Oops verstehen und wie Sie Kernel-Oops debuggen können. Außerdem gibt es dieses hervorragende Tutorial zum Debuggen des Kernels
Hinweis:Wie unten von Eugene vorgeschlagen, möchten Sie vielleicht zuerst addr2line ausprobieren, es benötigt jedoch immer noch ein Bild mit Debugging-Symbolen, zum Beispiel
addr2line -e vmlinux_with_debug_info 0019594c(+offset)