Kapitel 10. Kernel-Fehlersuche

Inhaltsverzeichnis
10.1. Besorgen eines Speicherauszugs nach einem Kernel-Absturz (Kernel-Crash-Dump)
10.2. Fehlersuche in einem Speicherauszug nach einem Kernel-Absturz mit kgdb
10.3. Fehlersuche in einem Speicherauszug nach einem Absturz mit DDD
10.4. Post-Mortem-Auswertung eines Speicherauszugs
10.5. Online-Kernel-Fehlersuche mit DDB
10.6. Online-Kernel-Fehlersuche mit GDB auf einem entfernten System
10.7. Fehlersuche bei ladbaren Modulen mit GDB
10.8. Fehlersuche bei einem Konsolen-Treiber
10.9. Fehlersuche bei Deadlocks
10.10. Glossar der Kernel-Optionen zur Fehlersuche
Contributed by Paul Richards, Jörg Wunsch und Robert Watson. Übersetzt von Fabian Ruch.

10.1. Besorgen eines Speicherauszugs nach einem Kernel-Absturz (Kernel-Crash-Dump)

Wenn ein Entwicklungs-Kernel (z.B. FreeBSD-CURRENT) wie zum Beispiel ein Kernel unter Extrembedinungen (z.B. sehr hohe Belastungsraten (Load), eine äußerst hohe Anzahl an gleichzeitigen Benutzern, Hunderte jail(8)s usw.) eingesetzt oder eine neue Funktion oder ein neuer Gerätetreiber in FreeBSD-STABLE verwendet wird (z.B. PAE), tritt manchmal eine Kernel-Panic ein. In einem solchen Fall zeigt dieses Kapitel, wie dem Absturz nützliche Informationen entnommen werden können.

Bei Kernel-Panics ist ein Neustart unvermeidlich. Nachdem ein System neu gestartet wurde, ist der Inhalt des physikalischen Speichers (RAM), genauso wie jedes Bit, das sich vor der Panic auf dem Swap-Gerät befand, verloren. Um die Bits im physikalischen Speicher zu erhalten, zieht der Kernel Nutzen aus dem Swap-Gerät als vorübergehenden Ablageort, wo die Bits, welche sich im RAM befinden, auch nach einem Neustart nach einem Absturz verfügbar sind. Durch diese Vorgehensweise kann ein Kernel-Abbild, wenn FreeBSD nach einem Absturz startet, abgezogen und mit der Fehlersuche begonnen werden.

Anmerkung: Ein Swap-Gerät, das als Ausgabegerät (Dump-Device) konfiguriert wurde, verhält sich immer noch wie ein Swap-Gerät. Die Ausgabe auf Nicht-Swap-Geräte (wie zum Beispiel Bänder oder CDRWs) wird zur Zeit nicht unterstützt. Ein “Swap-Gerät” ist gleichbedeutend mit einer “Swap-Partition”.

Damit es möglich ist, einen brauchbaren Kern zu entnehmen, ist es nötig, dass mindestens eine Swap-Partition groß genug ist, um alle Bits im physikalischen Speicher zu fassen. Wenn eine Kernel-Panic eintritt, bevor das System neu startet, überprüft der Kernel automatisch, ob ein Swap-Gerät als Ausgabegerät konfiguriert wurde. Falls ein gültiges Ausgabegerät vorhanden ist, legt der Kernel den Inhalt dessen, was sich im physikalischen Speicher befindet, auf dem Swap-Gerät ab.

10.1.1. Konfigurieren des Ausgabegeräts

Bevor der Kernel den Inhalt seines physikalischen Speichers auf einem Ausgabegerät ablegt, muss ein solches konfiguriert werden. Ein Ausgabegerät wird durch Benutzen des dumpon(8)-Befehls festgelegt, um dem Kernel mitzuteilen, wohin die Speicherauszüge bei einem Kernel-Absturz gesichert werden sollen. Das dumpon(8)-Programm muss aufgerufen werden, nachdem die Swap-Partition mit swapon(8) konfiguriert wurde. Dies wird normalerweise durch Setzen der dumpdev-Variable in rc.conf(5) auf den Pfad des Swap-Geräts (der empfohlene Weg, um einen Kernel-Speicherauszug zu entnehmen) bewerkstelligt.

Als Alternative kann das Ausgabegerät mittels der dump-Direktive in der config(5)-Zeile einer Kernel-Konfigurationsdatei fest verankert werden. Diese Vorgehensweise ist veraltet und sollte nur verwendet werden, falls der Kernel abstürzt, bevor dumpon(8) ausgeführt werden kann.

Tipp: Vergleichen Sie /etc/fstab oder swapinfo(8) für eine Liste der Swap-Geräte.

Wichtig: Stellen Sie sicher, dass das in rc.conf(5) festgelegte dumpdir vor einem Kernel-Absturz vorhanden ist.

# mkdir /var/crash
# chmod 700 /var/crash

Denken Sie auch daran, dass der Inhalt von /var/crash heikel ist und sehr wahrscheinlich vertrauliche Informationen wie Passwörter enthält.

10.1.2. Entnehmen eines Kernel-Speicherauszugs (Kernel-Dump)

Sobald ein Speicherauszug auf ein Ausgabegerät geschrieben wurde, muss er entnommen werden, bevor das Swap-Gerät eingehängt wird. Um einen Speicherauszug aus einem Ausgabegerät zu entnehmen, benutzen Sie das savecore(8)-Programm. Falls dumpdev in rc.conf(5) gesetzt wurde, wird savecore(8) automatisch beim ersten Start in den Multiuser-Modus nach dem Absturz und vor dem Einhängen des Swap-Geräts aufgerufen. Der Speicherort des entnommenen Kernels ist im rc.conf(5)-Wert dumpdir, standardmäßig /var/crash, festgelegt und der Dateiname wird vmcore.0 sein.

In dem Fall, dass bereits eine Datei mit dem Namen vmcore.0 in /var/crash (oder auf was auch immer dumpdir gesetzt ist) vorhanden ist, erhöht der Kernel die angehängte Zahl bei jedem Absturz um eins und verhindert damit, dass ein vorhandener vmcore (z.B. vmcore.1) überschrieben wird. Während der Fehlersuche, möchten Sie höchst wahrscheinlich den vmcore mit der höchsten Version in /var/crash benutzen, wenn Sie den passenden vmcore suchen.

Tipp: Falls Sie einen neuen Kernel testen, aber einen anderen starten müssen, um Ihr System wieder in Gang zu bringen, starten Sie es nur in den Singleuser-Modus, indem Sie das -s-Flag an der Boot-Eingabeaufforderung benutzen, und nehmen dann folgende Schritte vor:

# fsck -p
# mount -a -t ufs       # make sure /var/crash is writable
# savecore /var/crash /dev/ad0s1b
# exit                  # exit to multi-user

Dies weist savecore(8) an, einen Kernel-Speicherauszug aus /dev/ad0s1b zu entnehmen und den Inhalt in /var/crash abzulegen. Vergessen Sie nicht sicherzustellen, dass das Zielverzeichnis /var/crash genug freien Speicherplatz für den Speicherauszug zur Verfügung hat. Vergessen Sie auch nicht, den korrekten Pfad des Swap-Geräts anzugeben, da es sehr wahrscheinlich anders als /dev/ad0s1b lautet!

Der empfohlene und zweifellos einfachste Weg, um das Besorgen eines Speicherauszugs bei einem Absturz zu automatisieren, ist, die dumpdev-Variable in rc.conf(5) zu benutzen.

Wenn Sie Fragen zu FreeBSD haben, schicken Sie eine E-Mail an <de-bsd-questions@de.FreeBSD.org>.
Wenn Sie Fragen zu dieser Dokumentation haben, schicken Sie eine E-Mail an <de-bsd-translators@de.FreeBSD.org>.