Ściągamy źródła Linuxa (z http://www.kernel.org/pub/linux/kernel/v2.6/ lub mirrora) i dekompresujemy je.
Dla wygody robimy linka:
ln -s /usr/src/linux-2.6.17-13 /usr/src/linux
Ś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ą.
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
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.
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.
Zapisujemy konfigurację.
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
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.
Uruchamiamy ponownie komputer.
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ę.
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. |
rd | Wyświetla zawartość rejestrów procesora. |
rm %reg val | Wpisuje do danego rejestru daną zawartość. (Nie działa dla rejestrów kontrolnych.) |
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.) |
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). |
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. |