Diese Funktion wird seit FreeBSD 2.2 unterstützt und ist wirklich sehr geschickt.
GDB unterstützt die Fehlersuche von einem entfernten System aus bereits einige Zeit. Dies geschieht unter Benutzung eines sehr einfachen Protokolls über eine serielle Verbindung. Anders als bei den anderen, oben beschriebenen, Vorgehensweisen werden hier zwei Systeme benötigt. Das eine ist das Hostsystem, welches die Umgebung zur Fehlersuche, einschließlich aller Quellen und einer Kopie der Kernel-Binärdatei mit allen Symbolen bereitstellt, und das andere das Zielsystem, welches einfach nur eine Kopie desselben Kernels ausführt (ohne die Informationen zur Fehlersuche).
Sie sollten den Kernel im Zweifelsfall mit config -g
konfigurieren, DDB
in die Konfiguration aufnehmen und den
Kernel, wie sonst auch, kompilieren. Dies ergibt, aufgrund der zusätzlichen Informationen
zur Fehlersuche, eine umfangreiche Binärdatei. Kopieren Sie diesen Kernel auf das
Zielsystem, entfernen Sie die Symbole zur Fehlersuche mit strip
-x und starten Sie ihn mit der -d
-Boot-Option. Stellen
Sie die serielle Verbindung zwischen dem Zielsystem, welches "flags 80" für dessen
sio-Gerät gesetzt hat, und dem Hostsystem, welches die Fehlersuche übernimmt, her. Nun
wechseln Sie auf dem Hostsystem in das Bauverzeichnis des Ziel-Kernels und starten gdb:
% kgdb kernel GDB is free software and you are welcome to distribute copies of it under certain conditions; type "show copying" to see the conditions. There is absolutely no warranty for GDB; type "show warranty" for details. GDB 4.16 (i386-unknown-freebsd), Copyright 1996 Free Software Foundation, Inc... (kgdb)
Stellen Sie die entfernte Sitzung zur Fehlersuche ein mit (angenommen, der erste serielle Port ist in Verwendung):
(kgdb) target remote /dev/cuaa0
Jetzt geben Sie auf dem Zielsystem, welches noch vor Beginn der Gerätesuche in DDB gelangt ist, ein:
Debugger("Boot flags requested debugger") Stopped at Debugger+0x35: movb $0, edata+0x51bc db> gdb
DDB antwortet dann mit:
Next trap will enter GDB remote protocol mode
Jedesmal wenn Sie gdb eingeben, wird zwischen dem lokalen DDB und entfernten GDB umgeschaltet. Um einen nächsten Trap sofort zu erzwingen, geben Sie einfach s (step) ein. Ihr GDB auf dem Hostsystem erhält nun die Kontrolle über den Ziel-Kernel:
Remote debugging using /dev/cuaa0 Debugger (msg=0xf01b0383 "Boot flags requested debugger") at ../../i386/i386/db_interface.c:257 (kgdb)
Sie können mit dieser Sitzung wie mit jeder anderen GDB-Sitzung umgehen, einschließlich vollem Zugriff auf die Quellen, Starten im gud-Modus innerhalb eines Emacs-Fensters (was Ihnen automatische Quelltext-Ausgabe in einem weiteren Emacs-Fenster bietet), usw.
Zurück | Zum Anfang | Weiter |
Online-Kernel-Fehlersuche mit DDB | Nach oben | Fehlersuche bei einem Konsolen-Treiber |
Wenn Sie Fragen zu FreeBSD haben, schicken Sie eine E-Mail an
<[email protected]>.
Wenn Sie Fragen zu dieser Dokumentation haben, schicken Sie eine E-Mail an <[email protected]>.