Mittwoch, 30. Juli 2008

Der Solaris Kerneldebugger: Ein Beispiel

Mein Notebook hat die unangenehme Angewohnheit das es unter Solaris gerne einen NMI produziert (Non Maskable Interrupts sind etwas unangenehme Zeitgenossen die z.b. bei Hardwarefehlern auftreten). Nach ein bisschen schmökern im Sourcecode von Solaris ist mir dann aufgefallen das es dort folgende Varibale im pcie Modul gibt:
uint32_t pcie_serr_disable_flag = 0;    /* Disable SERR */

In einem Kommentar wird erwähnt das bei aktiviertem SERR eventuell ein NMI entsteht (welcher aber nicht behandelt wird). Jetzt wollen wir den Inhalt dieser Variable also auf 1 haben damit SERR deaktiviert wird und wir den NMI los sind. Dazu nehmen wir den Kerneldebugger. Durch einfaches Anhängen von -kd im Kerneleintrag von Grub landet man gleich zu Anfang am Debugprompt. Wir wollen jetzt zu dem Punkt springen an dem unser pcie Modul geladen wird, das erreichen wir indem wir dem Debugger sagen das es an diesem Punkt halten soll.

::bp pcie`_init
::cont

Damit wird ein so genannter Breakpoint gesetzt. Wird dieser erreicht halten wir an und gelangen wieder an den Prompt. ::cont sagt dem Debugger einfach
das das Programm weiterlaufen soll.

Wir erreichen nun unseren Breakpoint. Jetzt können wir den Inhalt unserer Variable einfach mit
pcie_serr_disable_flag/W 1

auf 1 setzen und mit ::cont weiterbooten ohne das der NMI auftaucht.

Praktische Sache oder? ;)

Keine Kommentare: