KGDB jest debugerem z poziomu kodu jądra linuksa (source level debugger). Do działania wykorzystuje gdb, dzięki czemu można debugować jądro w sposób analogiczny do innych aplikacji. Umożliwia ustawianie break-pointów, wykonywać kod krok po kroku, śledzić zmienne i zawartość rejestrów.
Aby skorzystać z KGDB potrzeba dwóch komputerów:
KGDB jest łatką dodającą do kodu jądra następujące komponenty:
Zalety
KGDB jest dostępny na wiele architektur; i386, x86_64, ppc, arm, mips i ia64.
Maszyna developerska powinna mieć przynajmniej 128MB RAMu, tak by ładowanie informacji debuggera do gdb nie powodowało nadmiernego wykorzystania swapu.
Obie maszyny wymagają Red Hata 7.3 lub późniejszego. Maszyna testowa musi działać na kernelu który chcemy debugować, maszyna developerska może działać na dowolnym kernelu.
Obsługa KGDB jest praktycznie identyczna z obsługą gdb. Poniżej znajdują się opisy wybranych instrukcji.
KGDB umożliwia wyświetlanie informacji konsolowych w gdb, dzięki czemu wszystko mamy na jednym ekranie maszyny developerskiej.
Gdy korzystamy z systemu wieloprocesorowego KGDB dba o to, żeby wszystkie procesory znalazły się pod jego kontrolą.
W sytuacjach kernel panic KGDB przejmuje kontrolę, dzięki czemu istnieje możliwość analizy debugowanego jądra.
KGDB umożliwia debugowanie modułów. Do tego wymagane jest jednak zainstalowanie zmodyfikowanego gdb - gdbmod na maszynie develperskiej. Można je pobrać ze strony http://kgdb.sourceforge.net/.
cvs -z3 -d:pserver:anonymous@kgdb.cvs.sourceforge.net:/cvsroot/kgdb co -r linux2_6_17 .
W bieżącym katalogu zostaną utworzone dwa katalogi: CVS i kgdb-2. Ten pierwszy możemy usunąć. W drugim oczywiście znajdują się źródła KGDB.cd linux-2.6.17.13-kgdb
for p in $(grep patch ../kgdb-2/series); do patch -p1 -i ../kgdb-2/$p; done
EXTRAVERSION = .13-kgdb
make menuconfig
Kernel hacking ->
[*] KGDB: kernel debugging with remote gdb ->
[*] KGDB: Console messages through gdb
Method for KGDB communication (KGDB: On generic serial port (8250)) --->
( ) KGDB: Use only kernel modules for I/O
(X) KGDB: On generic serial port (8250)
( ) KGDB: On ethernet - in kernel
[*] Simple selection of KGDB serial port
(115200) Debug serial port baud rate
(0) Serial port number for KGDB
make && make modules_install
init/built-in.o: In function `try_name':
/usr/src/linux-2.6.17.13-kgdb/init/do_mounts.c:115: undefined reference to `__stack_chk_fail'
CFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \ -fno-strict-aliasing -fno-common -fno-stack-protector CFLAGS += $(call cc-option, -fno-stack-protector)
scp arch/i386/boot/bzImage user@host:/boot/vmlinuz-2.6.17.13-kgdb
scp System.map user@host:/boot/System.map-2.6.17.13-kgdb
mkinitramfs -o initrd.img-2.6.17.13-kgdb 2.6.17.13-kgdb
Kopiujemy na maszynę testową nowoutworzony ramdysk:scp initrd.img-2.6.17.13-kgdb user@host:/boot/initrd.img-2.6.17.13-kgdb
title Kernel 2.6.17.13-kgdb
root (hd0,0)
kernel /boot/vmlinuz-2.6.17.13-kgdb root=/dev/hda1 ro kgdbwait
initrd initrd.img-2.6.17.13-kgdb
boot
Ciąg dalszy instalacji dotyczy VMware zainstalowanego w systemie Windows. Instalacja w systemie Linux opisana jest w internecie (hasła kgdb vmware).
ip_naszego_komputera:port
Uncompressing Linux... Ok, booting the kernel.
cd /usr/src/linux-2.6.17.13-kgdb
i uruchamiamy gdb:gdb ./vmlinux
otrzymujemy odpowiedź:
GNU gdb 6.4.90-debian
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or 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.
This GDB was configured as "i486-linux-gnu"...Using host libthread_db library "/lib/tls/i686/cmov/libthread_db.so.1".
(gdb)
(gdb) target remote ip_naszego_komputera:port
O ile gdb uda się połączyć wypisuje komunikat:
Remote debugging using ip_naszego_komputera:port
breakpoint () at kernel/kgdb.c:1691
1691 atomic_set(&kgdb_setting_breakpoint, 0);
Filmik (2.98 MB) pokazujący komunikację dwóch maszyn wirtualnych i ładowanie jądra z wykorzystaniem KGDB.