KGDB

Co to jest?

Możliwości

Dodatkowe funkcjonalności

Pomocne linki:

Instalacja

Ponieważ większość osób nie dysponuje dwoma komputerami, oraz kablem szerogowym RS-232, więc przedstawię instalację KGDB na dwóch wirtualnych maszynach (VMware pod Windows). Większość kroków które tu opiszemy należy powtórzyć przy każdej instalacji tego debuggera. Jeśli ktoś chciałby zainstalować KGDB pod linuksem (wtedy wystarczy tylko jedna wirtualna maszyna) to zachęcam do obejrzenia jednego z linków. Proces ten został tam dosyć szczegółowo omówiony (zwłaszcza konfiguracja portu szeregowego). Instalacja zostanie opisana na przykładzie KGDB w wersji 2.4 (najnowsza w chwili obecnej), jądra 2.6.15.6 (w tej chwili nie ma jeszcze wersji KGDB dla jądra 2.6.17) oraz architektury i386.
  1. Uruchamiamy VMware, tworzymy 2 wirutalne maszyny, oraz instalujemy na nich preferowaną przez nas dystrybucję linuxa. Teraz startujemy wirtualna maszynę która będzie spełniać zadania maszyny development.
  1. Ściągamy odpowiednie źródła linuxa oraz rozpakowujemy je:
cd /usr/src
wget "http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.15.6.tar.bz2"
tar -jxvf linux-2.6.15.6.tar.bz2
  1. Ściągamy patche KGDB oraz aplikujemy je:
cd /usr/src
wget "http://kgdb.linsyssoft.com/downloads/kgdb-2/linux-2.6.15.5-kgdb-2.4.tar.bz2"
tar -jxvf linux-2.6.15.5-kgdb-2.4.tar.bz2
cd linux-2.6.15.6
patch -p1 < ../linux-2.6.15.5-kgdb-2.4/core-lite.patch
patch -p1 < ../linux-2.6.15.5-kgdb-2.4/core.patch
patch -p1 < ../linux-2.6.15.5-kgdb-2.4/i386-lite.patch
patch -p1 < ../linux-2.6.15.5-kgdb-2.4/i386.patch
patch -p1 < ../linux-2.6.15.5-kgdb-2.4/8250.patch 
  1. Zaznaczamy w menuconfigu odpowiednie opcje. Wszystkie je można znaleźć w zakładce Kernel Hacking:
  1. Kompilujemy jądro naszym ulubionym sposobem np:
cd /usr/src/linux-2.6.15.6
make
po czym cierpliwie czekamy, aż jądro które chcemy zdebuggować będzie gotowe.
  1. Gdy kompilacja zakończy sie pomyślnie powinny nam powstać pliki vmlinux i arch/i386/boot/bzImage Ten drugi plik należy teraz przenieść na maszynę target. Można to zrobić np stawiając serwer ssh i używając scp.
    cd /usr/src/linux-2.6.15.6
    scp arch/i386/boot/bzImage adres_maszyny_target:/boot/bzImage-bugged
    
  1. Uruchamiamy maszynę target i dodajemy nowy wpis do gruba (ewentualnie lilo)
vim /boot/grub/menu.lst
nowa pozycja powinna wyglądać tak (z dokładnością do preferowanych nazw):

title Kernel 2.6.15.6-bugged
root (hd0,2)
kernel /boot/bzImage-bugged root=/dev/hda3 ro kgdbwait
boot
  1. Dodajemy nowy port szeregowy do maszyny target. Konfigurujemy go by łączył się z named pipe o nazwie \\.\pipe\com_1. Z zaawansowanych opcji wybieramy: "yield CPU on poll".
  1. Ściągamy i instalujemy program "Named Pipe TCP Proxy". Patrz linki ;-)
  1. Uruchamiamy proxy i ustanawiamy nowe połączenie pomiędzy portem lokalnym na naszym komputerze domowym (np. 8222) oraz \\.\pipe\com_1. Koniecznie należy zaznaczyć opcję enable non-local systems access.

Uruchomienie

  1. Uruchamiamy maszynę target i z menu gruba wybieramy Kernel 2.6.15.6-bugged. System powinien się zatrzymać po wypisaniu kilku komunikatów
  1. Na maszynie development uruchamiamy gdb:
cd /usr/src/linux-2.6.15.6
gdb vmlinux
  1. Nawiązujemy połączenie z drugą maszyną:
target remote ip:port_number
, gdzie ip - to adres pod jakim VMware widzi Windows (u mnie 192.168.80.1), a port_number to numer portu który wybraliśmy w "Named Pipe TCP Proxy".
  1. Jeśli wszystko się udało powinniśmy mieć już kontrolę nad jądrem na maszynie target. Możemy kazać mu dalej się uruchamiać wpisując:
continue

Debuggowanie

Przykład użycia KGDB do debuggowania jądra przedstawia poniższy screen cast: Na filmie debian_2 to maszyna development natomiast debian_IDE to maszyna target. Pokazuje on kolejno proces uruchomienia obu wirtualnych maszyn. Breakpoint zostanie ustawiony na funkcji do_execve, która jest wywoływana przy uruchomianiu programów przez użytkownika. W celu demonstracji breakpointa zostanie wywolane polecenie ls. Następnie zostanie pokazane użycie dobrze wszystkim znanym poleceń gdb do śledzenia kodu jądra. Miłego oglądania ;-)