KDB (Built-in Kernel Debugger)


KDB to odpluskwiacz, który umożliwia badanie pamięci i struktur danych podczas pracy systemu. Nie wymaga do działania dodatkowego komputera. Nie jest możliwa przy jego pomocy praca na poziomie kodu źródłowego (nie można np. ustawić pułapki w konkretnym pliku, na określonej linii kodu jądra).

Umożliwia m.in następujące operacje:

Instalacja

Jeśli podczas kompilacji jądra wybraliśmy opcję CONFIG_KDB_OFF to w celu aktywacji kdb należy przy bootowaniu podać parametr kdb=on.

Można to również zrobić poprzez wpisanie 1 do odpowiedniego pliku:

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

Wpisanie do niego 0 spowoduje deaktywację kdb.

Po aktywowaniu kdb mozna wywołać naciskając klawisz Pause/Break. Pojawia się wtedy komunikat postaci:

Entering kdb (current=0xc03ff280, pid 0) due to Keyboard Entry. 
kdb>

i wsztrzymywana jest wszelka aktywność systemu operacyjnego. Odpluskwiacz jest również wywoływany, gdy pojawia sie oops (wyjątek wyzwalany w przypadku anomalii w zachowaniu systemu, mający na celu ochronę danych, sprzętu przed uszkodzeniem, zapamiętujący dane przydatne przy diagnozowaniu problemu), kernel panic, a także po napotkaniu pułapki (breakpoint).

Można go również wywołać z poziomu kodu źródłowego, korzystając z makra KDB_ENTER() z pliku /include/asm/kdb.h np.

if (warunek())
  KDB_ENTER()

Działanie linuksa wznawia się wpisując go i naciskając enter.

kdb> go

Można wymusić wznowienie od konkretnego miejsca, wstawiając adres za go. Pozwala to np. ominąć pewne instrukcje.

Polecenia:

KGDB


KDGB - odpluskwiacz jądra wykorzystywany wraz z gdb, który działa na poziomie źródeł. Pozwala na wstawianie pułapek w kodzie kernela, wykonywanie kodu instrukcja po instrukcji, obserwację zmiennych. Do działania wymaga dwóch komputerów połączonych kablem szeregowym. (obecne wersje KGDB umożliwiają również pracę poprzez siec Ethernet). Na pierwszym komputerze, testowym znajduje sie jądro, które chcemy badać, na drugim działa gdb.

Instalacja (maszyna deweloperska)

  1. Ściągnąć źródła linuksa.
  2. Ściągnąć patch pasujący do źródeł ze strony http://kgdb.linsyssoft.com/downloads/kgdb-2/
    np. kgdb.linsyssoft.com/downloads/kgdb-2/linux-2.6.7-kgdb-2.2.tar.bz2
  3. Nałożyć patch.
  4. Skonfigurować jądro pamiętając o wybraniu odpowiednich opcji z sekcji Kernel hacking:

    Obowiązkowo: Opcja ta pozwala dodatkowo na wybór rodzaju komunikacji:
    My wybieramy KGDB: On generic serial port (8250)

    Opcjonalnie:
  5. Skompilować jądro.

Instalacja (maszyna testowa)

  1. Przekopiować utworzone pliki bzImage (jako vmlinuz) i System.map na maszynę testową do katalogu /boot.
  2. Dodać odpowiedni wpis do grub'a lub lilo na maszynie testowej.

    przykład 6 (wpis dla lilo):

       image = /boot/vmlinuz
       label = Linux-KGDB
       append = "kgdbwait kgdb8250=0,115200"
    

Uruchamianie:

  1. Uruchomić maszynę testową. Pojawi się komunikat:
    Waiting for connection from remote gdb...
    
  2. Na maszynie deweloperskiej wywołać gdb:
    $ gdb ./vmlinux
    

    Ustalić prędkość transmisji:

    (gdb) set remotebaud 115200
    

    Spróbować nawiązać połączenie z maszyną testową:

    (gdb) target remote /dev/ttyS0
    

    Poczekać na odpowiedź:

    Remote debugging using /dev/ttyS0
    breakpoint () at kernel/kgdb.c:1212
    1212            atomic_set(&kgdb_setting_breakpoint, 0);
    warning: shared library handler failed to enable breakpoint
    (gdb)
    

    Wywołać continue:

    (gdb) c
    

Często nie dysponujemy dwoma komputerami. W takiej sytuacji wygodnie jest skorzystać z maszyny wirtualnej.

Uruchamianie przy użyciu VMware Workstation:

  1. Wykonać omówione wyżej kroki instalacji dla maszyny deweloperskiej. Przekopiować utworzone pliki bzImage (jako vmlinuz) i System.map do katalogu /boot. Dodać 2 wpisy do grub'a lub lilo. Jeden dla maszyny testowej, drugi dla deweloperskiej.

    przykład 7 (lilo):

    Pierwszy wpis taki jak w omówionym wyżej przypadku instalacji dla maszyny testowej, drugi podobny, ale bez parametru append = "kgdbwait kgdb8250=0,115200".

  2. Sklonować maszynę.
  3. Dodać do maszyny testowej port szeregowy połączony z łączem nazwanym \\.\\pipe\com_1.
  4. Ściągnąć program Named Pipe TCP Proxy ze strony shvechkov.tripod.com/nptp.html a następnie zainstalować.
  5. Uruchomić Named Pipe TCP Proxy, stworzyć połączenie między jakimś portem na komputerze np. 8250 a \\.\pipe\com_1.
    Wybrać enable non-local systems access.
  6. Uruchomić maszynę deweloperską.
  7. Uruchomić maszynę testową. Poczekać na komunikat:
    Waiting for connection from remote gdb...
    
  8. Na maszynie deweloperskiej uruchomić gdb:
    $ gdb ./vmlinux
    
  9. Wpisać target remote adres_ip_komputera_na_ktorym_dziala_vmware:8250
  10. Wpisać continue.
  11. Poczekać na załadowanie systemu na maszynie testowej.

Jako, że debugując przy pomocy kgdb korzystamy z gdb, odpluskwianie jądra przypomina debugowanie zwykłego programu przy pomocy gdb (o czym była mowa wcześniej). Nie będę w związku z tym rozpisywał się zbytnio o dostępnych poleceniach.

Niemniej jednak:

Ctrl + C wywołane w gdb wstrzymuje wykonanie kernela na maszynie testowej. Przechodzi on pod kontrolę kgdb i można go debugować przy pomocy gdb (innym powodem wstrzymania działania może być np. napotkanie pułapki).

Wpisanie continue lub c w gdb powoduje wznowienie działania kernela na maszynie testowej.

Kilka poleceń:


Przy pomocy kgdb możliwe jest również debugowanie modułów, ale jest ono nieco bardziej skomplikowane, jako że pliki obiektowe modułów nie zawierają adresów absolutnych. Adresy są zmieniane na absolutne przez insmod przed załadowaniem modułu.

Aby debugować moduły należy zainstalować specjalną wersję gdb na maszynie deweloperskiej dostępną pod adresem http://kgdb.linsyssoft.com/downloads/gdbmod-2.4.bz2. Trzeba też odpowiednio zbudować moduł (w przypadku gcc opcja -g) i podać gdb ścieżkę do katalogu z plikami modułu:

(gdb) set solib-search-path /home/mm/moduly

Ma to na celu udostępnienie gdb symboli modułu.



Bibliografia

kdb

http://oss.sgi.com/projects/kdb/
http://linuxdevices.com/articles/AT3761062961.html
http://www.luv.asn.au/overheads/embedded/kdb.pdf
http://www.goldenbits.com/newsletter/issue3/gbtechnews_issue3.pdf
http://www-128.ibm.com/developerworks/linux/library/l-debug/
prezentacje dotyczące odpluskwiania z ubiegłego roku
Documentation/kdb

kgdb

http://kgdb.linsyssoft.com/
http://oslab.info/index.php/Misc/KGDB
http://shvechkov.tripod.com/nptp.html