KDB

Co to jest?

  • KDB (built-in Kernel DeBugger for linux) jest patch'em na jądro Linux'a, który umożliwia badanie zawarości pamięci, struktur danych, stanu procesu w trakcie działania systemu.
  • KDB wymaga JEDNEJ maszyny.
  • KDB Obsługuje systemy wieloprocesorowe.
  • NIE jest możliwe debugowanie z poziomu kodu - tylko instrukcje assemblera.
  • Instalacja

    Instalacja w skrócie polega na dodaniu patch'y i rekompilacji jądra.
    Należy wykonać następujące kroki:
    1. Ściągnąc dwa patch'e dla odpowiedniej wersji jądra - Strona projektu KDB.
      np:
      kdb-v4.4-2.6.17-common-1.bz2
      kdb-v4.4-2.6.17-i386-1.bz2
      Dla KDB w wersji 4.4 na jądro 2.6.17 na archtekturę i386.
    2. Skopiować ściągnięte patch'e do /usr/src/linux i rozpakować:
      #bzip2 -d kdb-v4.4-2.6.17-common-1.bz2
      #bzip2 -d kdb-v4.4-2.6.17-i386-1.bz2
    3. Zastosować patch'e:
      #patch -p1 <kdb-v4.4-2.6.17-common-1
      #patch -p1 <kdb-v4.4-2.6.17-i386-1
    4. Wybór opcji kompilacji jądra - sekcja "Kernel Hacking":
        "Built-in Kernel Debugger support" - ustawia flagę CONFIG_KDB - wymagane
        "Compile the kernel with frame pointers" - ustawia flagę CONFIG_FRAME_POINTER - opcjonalnie
        (lepsze śledzenie stosu wywołań)
        "KDB off by default" - ustawia flagę CONFIG_KDB_OFF - KDB wylączone domyślnie
    5. Rekompiacja jądra - zalecane "make clean" przed kompilacją.

    Praca z KDB

    Gdy KDB jest aktywne i zostanie przywołane (szczegóły niżej) system zostaje zatrzymany. Użytkownik znajduje się wtedy w trybie pracy z KDB i może debuggować jądro systemu. Polecenie "go" powoduje wznowienie wykonywania kodu jądra przez system.

    Aktywowanie

    KDB jest domyślnie aktywne od startu systemu. Sytuację tą zmienia wybranie flagi CONFIG_KDB_OFF przed kompilacją jądra.
    W takim wypadku KDB aktywujemy ustawiając flagę "kdb=on" przed załadowaniem systemu.
    Możemy to zrobić również po załadowaniu systemu:
    #echo "1" >/proc/sys/kernel/kdb

    Podobnie postępujemy, gdy KDB jest domyślnie aktywne i chcemy je deaktywować.
    "kdb=off"
    #echo "0" >/proc/sys/kernel/kdb

    Przywoływanie


    KDB zostaje przywołane w następujących przypadkach:
  • automatycznie - jeśli napotkamy na kernel panic,
  • automatycznie - jeśli napotka na wcześniej zdefiniowany breakpoint,
  • ręcznie - przez naciśnięcie PAUSE (Ctrl-Pause Break) przez użytkownika,
  • Ctrl-A - wywołuje KDB z serial console.
  • Możliwości

  • Śledzenie wykonania kodu jądra instrukcja po instrukcji (assembler).
  • Wyświetlanie zawartości pamięci i możliwość wprowadzania zmian.
  • Zatrzymanie wykonania w wyniku napotkania na określoną instrukcję.
  • Zatrzymanie wykonania w wyniku dostępu (modyfikacji) określonych miejsc w pamięci.
  • Zatrzymanie wykonania w wyniku dostępu (modyfikacji) rejestrów.
  • Oglądanie stosu wywołań dla określonego procesu (podając PID).
  • Deasemblacja instrukcji.
  • Komendy KDB

    Do zbioru komend z poziomu KDB dostajemy się poleceniem "help".
    Są one na tyle dobrze opisane, że można się bez problemu zorientować, do czego służą.
    Ponadto w internecie znajduje się wiele stron przedstawiających i opisujących komendy KDB wraz z przykładami zastosowania. Zamiast przepiywać ich zawartość podam odpowiednie linki: