Poprzedni temat Spis treści Następny temat

Debugowanie jądra UML-a

Opiszę jak można debugować jądro UML-a za pomocą gdb. Oczywiście UML potrafi współpracować z innymi debugerami, ale prezentacja nie obejmowała tego tematu. Tylko wspomnę jak można uruchomić ddd do debugowania jądra UML-a.

Podczas kompilowania jądra dla UML-a trzeba pamiętać o zaznaczeniu Enable kernel debugging symbols i Enable ptrace proxy, dzięki czemu jądro zostanie skompilowane z opcją -g. Po skompilowaniu nie należy usuwać znaczników, bo to właśnie dzięki nim możemy debugować jądro.

Jak uruchomić gdb do debugowania UML-a?

Możemy to zrobić na 3 sposoby w zależności od tego czego oczekujemy i czy już został uruchomiony uml.

  1. host% gdb ./linux
    Jest to najprostsze wywołanie jednocześnie dające najmniej możliwości w trakcie użycia. Pierwszą rzeczą jaką musimy zrobić to ustawić parametry UML-a. Robimy to za pomocą komendy:
    host% set arg
    gdzie opcje uruchomienia wyglądają dokładnie tak samo jak przy odpalaniu UML-a.
    Jednak przy tej metodzie mamy dostępne tylko standardowe opcje gdb. W związku z tym jedynym sposobem śledzenia wykonania programu jest zakładanie pułapek(breakpointów). Co może się okazać niewygodne w użyciu.
  2. host% ./linux debug <inne opcje uruchomienia>
    Po wykonaniu tego polecenia uruchomi nam się jednocześnie jądro jak i oddzielne okienko gdzie będzie działać gdb. Jądro uruchomi się i zatrzyma. Podobnie jak ww. sposobie będziemy mieli dostęp do wszystkich komend gdb, ale jednocześnie zyskujemy bardzo przydatną opcję. W każdym momencie możemy w oknie gdb nacisnąc kombinację Ctrl+c, co spowoduje, że UML-a się zatrzyma i będziemy mogli śledzić krok po kroku lub za pomocą pułapek wykonanie UML-a.
  3. host% kill -USR1 <nr PID UML-a>
    Tym sposobem możemy uruchomić gdb już po wystartowaniu UML-a. W tym celu musimy znaleźć PID naszego UML-a. Będzie to pid pierwszego procesu o nazwie linux. Następnie wpisujemy powyższą komendę. Uruchomi się nam w oddzielnym oknie gdb i będziemy mogli debugować w ten sam sposób co w poprzednim przypadku.

Śledzenie śpiących procesów.

Czasem zdarza się, że niepoprawne działanie jest spowodowane działaniem innego procesu niż aktualnie wykonywany. Może on spać na jakimś semaforze lub czekać na jakiejś kolejce.
Dzięki gdb możemy podłączyć się do takiego procesu. W tym celu należy wykonać następujące czynności:
(gdb) det
Odłączamy się od aktualnie śledzonego procesu
(gdb) att <nr PID>
Podłączamy się pod interesujący nas proces. Przy czym musimy podać PID procesu w systemie macierzystym. Można uzyskać go przez śledzenie wyników wykonywania polecenia ps -a.
W tym momencie możemy wypisać interesujące nas dane dotyczące tego procesu.
Żeby system mógł dalej działać musimy wznowić działanie procesu, który był wykonywany wcześniej. Robimy to za pomocą następujących komend:
(gdb) det
(gdb) att 1
(gdb) c

© 2004 Mateusz Chrzęst, Piotr Krawczyk, Adam Kruszewski.