GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie kann man eine Linux-Kernel-Panik lesen, verstehen, analysieren und debuggen?

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 :

  1. Suchen Sie Ihren vmlinux oder die .ko Datei im Kernel-Root-Verzeichnis, dann disassemblieren Sie die Objektdatei :

    objdump -dS vmlinux > /tmp/kernel.s
    
  2. Öffnen Sie die generierte Baugruppendatei /tmp/kernel.s . mit einem Texteditor wie vim . Gehen Sie zu unwind_backtrace+0x0/0xf8 , d. h. nach der Adresse von unwind_backtrace suchen + die offset . 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:

  1. Führen Sie gdb <path-to-vmlinux> aus .
  2. Führen Sie im Prompt von gdb aus:list *(unwind_backtrace+0x10) .

Weitere Informationen finden Sie in den folgenden Ressourcen:

  1. Kernel-Debugging-Tricks.
  2. 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)


Linux
  1. Linux-Umgebungsvariablen:Lesen und Festlegen auf einem Linux-VPS

  2. Umgang mit einer Linux-Kernel-Panik

  3. Linux – Wie debuggt man ein Suspend-to-ram-Problem unter Linux?

  4. Wie debuggt man den Linux-Kernel mit GDB und QEMU?

  5. Wie liest man Linux Manpages?

Linux-Kernel und seine Funktionen

So durchsuchen und lesen Sie das gesamte Arch-Wiki als Linux-Manpages

So debuggen Sie Bash-Skripte in Linux und Unix

Was tun bei einer Linux-Kernel-Panik?

So lesen Sie die Ausgabe und Verwendung von Linux Top Command

Lesen und analysieren Sie Ihre Linux-Systemprotokolle mit Journalctl