10.7. Fehlersuche bei ladbaren Modulen mit GDB

Während der Fehlersuche bei einer Panic, die innerhalb eines Moduls oder unter Benutzung von GDB auf einem entfernten System gegen ein System, das dynamische Module benutzt, ausgelöst wurde, müssen Sie GDB mitteilen, wie es an die Informationen zu den Symbolen dieser Module kommt.

Zuerst müssen Sie die Module mit Informationen zur Fehlersuche bauen:

# cd /sys/modules/linux
# make clean; make COPTS=-g

Falls Sie GDB auf einem entfernten System benutzen, können Sie kldstat auf dem Zielsystem starten, um herauszufinden, wohin die Module geladen wurden:

# kldstat
Id Refs Address    Size     Name
 1    4 0xc0100000 1c1678   kernel
 2    1 0xc0a9e000 6000     linprocfs.ko
 3    1 0xc0ad7000 2000     warp_saver.ko
 4    1 0xc0adc000 11000    linux.ko

Falls Sie einen Speicherauszug nach einem Absturz auf Fehler untersuchen, müssen Sie die linker_files-Liste abgehen, beginnend mit linker_files->tqh_first und den link.tqe_next-Zeigern folgend, bis Sie den Eintrag mit dem Dateinamen, nach dem Sie suchen, gefunden haben. Der Adress-Teil des Eintrags ist die Adresse, wohin das Modul geladen wurde.

Als Nächstes müssen Sie den Adressabstand des Textabschnitts innerhalb des Moduls herausfinden:

# objdump --section-headers /sys/modules/linux/linux.ko | grep text
  3 .rel.text     000016e0  000038e0  000038e0  000038e0  2**2
 10 .text         00007f34  000062d0  000062d0  000062d0  2**2

Das, wonach Sie suchen, ist die .text-Zeile, Zeile 10 im Beispiel oben. Die vierte hexadezimale Spalte (insgesamt die sechste) zeigt den Adressabstand des Textabschnitts innerhalb der Datei. Addieren Sie diesen Adressabstand zu der Ladeadresse des Moduls, um die Verschiebungsadresse für den Code des Moduls zu erhalten. In unserem Beispiel erhalten wir 0xc0adc000 + 0x62d0 = 0x0ae22d0. Benutzen Sie den add-symbol-file-Befehl in GDB, um dem Debugger das Modul mitzuteilen:

(kgdb) add-symbol-file /sys/modules/linux/linux.ko 0xc0ae22d0
add symbol table from file "/sys/modules/linux/linux.ko" at text_addr = 0xc0ae22d0?
(y or n) y
Reading symbols from /sys/modules/linux/linux.ko...done.
(kgdb)

Sie sollten nun auf alle Symbole im Modul zugreifen können.

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>.