KDB - the Linux kernel debugger

Instalacja w 10 prostych krokach

  1. Ściągamy źródła Linuxa (z http://www.kernel.org/pub/linux/kernel/v2.6/ lub mirrora) i dekompresujemy je.

  2. Dla wygody robimy linka:

    ln -s /usr/src/linux-2.6.17-13 /usr/src/linux

  3. Ściągamy KDB z ftp://oss.sgi.com/www/projects/kdb/download/v4.4. Szukamy najpierw plików dla odpowiedniej wersji jądra, a z nich wybieramy 2: jeden "common", drugi odpowiedni dla naszej architektury. Na tym przykładzie: kdb-v4.4-2.6.17-common-n i kdb-v4.4-2.6.17-i386-n, gdzie n zastępujemy największą możliwą liczbą.

  4. Przenosimy te pliki do /usr/src/linux i rozpakowujemy KDB:

    cd /usr/src/linux
    bzip2 -d kdb-v4.4-2.6.17-common-1.bz2
    bzip2 -d kdb-v4.4-2.6.17-i386-1.bz2

  5. Stosujemy patche:

    patch -p1 <kdb-v4.4-2.6.17-common-1
    patch -p1 <kdb-v4.4-2.6.17-i386-1

    Powinny się wykonać bezbłędnie. Poleca się uprzednie wykonanie powyższych poleceń z opcją --dry-run, co nie zmodyfikuje żadnego pliku, a jedynie wypisze komunikaty.

  6. Konfigurujemy jądro:
    Wybieramy jedno z następujących poleceń:

    make xconfig
    make menuconfig
    make config

    Pierwsze wywołuje aplikację graficzną (patrz niżej), drugie tekstową, trzecie tekstową dla bardzo cierpliwych. Naszym celem jest ustawienie opcji CONFIG_KDB. Możemy również ustawić inne: CONFIG_KDB_OFF wyłączy nam KDB, a CONFIG_FRAME_POINTER pozwala śledzić stos.

  7. Zapisujemy konfigurację.

  8. Kompilujemy jądro:

    make bzImage

    (Robimy sobie przerwę na kawę bo to troszkę trwa.)
    Następnie jeszcze parę zaklęć:

    make modules
    mv /lib/modules/`uname -r` /lib/modules/`uname r`.bak
    make modules_install
    cp arch/i386/boot/bzImage /boot/mynewkernel

  9. Edytujemy LILO. Załóżmy, że mamy coś takiego:

    image=/boot/vmlinuz-2.2.14-5.0
    label=linux
    initrd=/boot/initrd-2.2.14-5.0.img
    read-only
    root=/dev/sda1

    Zmieniamy to na coś w stylu:

    image=/boot/mynewkernel
    label=new
    read-only
    root=/dev/sda1

    Pole "image" musi zawierać świeżo stworzony obraz jądra, a pole "label" coś krótkiego i przyjemnego. Na koniec, nie zapominamy o:

    lilo -v

    Szczęśliwi właściciele GRUBa z łatwością znajdą sposób przeprowadzenia analogicznej operacji.

  10. Uruchamiamy ponownie komputer.

Sposób używania

O ile nie ustawiliśmy wcześniej wspomnianej CONFIG_KDB_OFF, KDB domyślnie działa. W przeciwnym przypadku ratuje nas komenda:

echo "1" >/proc/sys/kernel/kdb

Oczywiście odwrotnie działa komenda:

echo "0" >/proc/sys/kernel/kdb

Gdy wiemy, że debugger działa, dostajemy się do niego wciskając pauzę.

Wyświetlanie i modyfikowanie zawartości pamięci

md addr n Wyświetla n linii spod danego (lub ostatnio wypisywanego) adresu
mdr addr Wyświetla surową zawartość pamięci z pod danego adresu o danej długości (w bajtach).
mm addr val Modyfikuje pamięć z danego adresu (jedno słowo maszynowe)wpisując tam daną zawartość.
mmW addr val J.w., z tym, że modyfikuje W bajtów.

Wyświetlanie i modyfikowanie zawartości rejestrów

rd Wyświetla zawartość rejestrów procesora.
rm %reg val Wpisuje do danego rejestru daną zawartość. (Nie działa dla rejestrów kontrolnych.)

Obsługa breakpointów

bp [function_name|addr] Tworzy breakpointa na funkcji lub adresie.
bl Wyświetla listę istniejących breakpointów.
be/bd nr Włącza/wyłącza breakpoint o podanym numerze.
bc nr Usuwa breakpointa o podanym numerze. (Wywołane z "*" usuwa wszystkie.)

Śledzenie stosu

bt [addr] Odczytuje informacje ze stosu dla bieżącego wątku. Jeśli nie podano adresu, próbuje go znaleźć na podstawie informacji zawartych w rejestrach. Wymaga wcześniej wspomnianej opcji CONFIG_FRAME_POINTER.
btp pid bt dla procesu o podanym pidzie.
btc bt dla każdego CPU.
bta [stan] bt dla wszystkich procesów (w danym stanie, jeśli jest podany).

Inne śmieszne

reboot Uruchamia ponownie system bez zamykania go.
id [function_name|addr] Dezasembluje funkcję o podanej nazwie / adresie.
ss "Sigle step" - wykonuje jedno polecenie i wraca do KDB.
go Normalna kontynuacja pracy systemu.

Źródła

http://oss.sgi.com/projects/kdb/ - strona projektu
http://linuxdevices.com/articles/AT3761062961.html - A guide to getting started with KDB.