Benutzer:Markus111/QEMU GDB — Änderungen 8687 → 8690

Zeile 1: Zeile 1:
 
= QEMU und GDB =
 
= QEMU und GDB =
 
[[QEMU]] bietet die Möglichkeit den laufenden Kernel mit [[GDB]] zu debuggen. Um dieses Feature zu aktivieren muss man seinen Kernel mit der Option „-g“ übersetzen und übergibt dann man die Parameter „-s“ (kurzform zu „-gdb tcp::1234“) und „-S“ mit an QEMU.
 
[[QEMU]] bietet die Möglichkeit den laufenden Kernel mit [[GDB]] zu debuggen. Um dieses Feature zu aktivieren muss man seinen Kernel mit der Option „-g“ übersetzen und übergibt dann man die Parameter „-s“ (kurzform zu „-gdb tcp::1234“) und „-S“ mit an QEMU.
−
Darauf startet man in einem neuen Terminal „gdb ''kernel-binary''“ GDB. Um diesen nun mit QEMU zu verbinden gibt man „target remote 1234“ (oder das entsprechende Device das man mit „-gdb“ QEMU übergebeb hat) in die GDB-Eingabeaufforderung ein. Darauf kann man Breakpoints setzen; um Beispielsweise in der Datei ''main.c'' in Zeile ''42'' einen Breakpoint einzufügen gibt man „break main.c:42“ ein. GDB sollte einem die entsprechende Adresse und die Nummer des Breakpoints ausgeben.
+
 
−
Sobald man den Befehl „continue“, oder deren Kurzform „cont“ eingibt (und mit Enter betstätigt) sollte der Kernel bis zum definierten Breakpoint laufen (außer er crasht vorher oder der Breakpoint ist unerreichbar).  
+
Beispiel:
−
Sobald der Breakpoint erreicht ist zeigt GDB die aktuelle Codezeile an und stoppt die Ausführung. Mit „display ''variable''“ kann man nun Variablen definieren, die bei jedem Schritt ausgeben werden sollen. Mit „undisplay ''variable''“ kann dies wieder abgeschaltet werden.
+
 
−
Den gestoppten Kernel kann man jetzt mit „next“ durchsteppen. Mit „step“ wird auch in Funktionen hereingesprungen. Um die Ausführung wieder fortzusetzen gibt man einfach „cont“ (oder „continue“) ein.
+
qemu -s -S -kernel kernel.bin
−
Ein „quit“ beendet GDB.
+
 
 +
Darauf startet man in einem neuen Terminal GDB (oder man hängt an den Aufruf von qemu ein ''&'' an).
 +
 
 +
gdb kernel.bin
 +
 
 +
Um diesen nun mit QEMU zu verbinden gibt man  
 +
 
 +
target remote 1234
 +
 
 +
(oder das entsprechende Device das man mit „-gdb“ QEMU übergeben hat) in die GDB-Eingabeaufforderung ein. Darauf kann man Breakpoints setzen; um Beispielsweise in der Datei ''main.c'' in Zeile ''42'' einen Breakpoint einzufügen gibt man  
 +
 
 +
break main.c:42
 +
 
 +
ein. GDB sollte einem die entsprechende Adresse und die Nummer des Breakpoints ausgeben.
 +
Sobald man den Befehl  
 +
 
 +
continue
 +
 
 +
oder deren Kurzform „cont“ eingibt (und mit Enter betstätigt), sollte der Kernel bis zum definierten Breakpoint laufen (außer er crasht vorher oder der Breakpoint ist unerreichbar).  
 +
Sobald der Breakpoint erreicht ist zeigt GDB die aktuelle Codezeile an und stoppt die Ausführung. Mit  
 +
 
 +
display ''variable''
 +
 
 +
kann man nun Variablen definieren, die bei jedem Schritt ausgeben werden sollen. Mit  
 +
 
 +
undisplay ''variable''
 +
 
 +
kann dies für die entsprechende Variable wieder abgeschaltet werden.
 +
Den gestoppten Kernel kann man jetzt mit  
 +
 
 +
next
 +
 
 +
durchsteppen. Mit  
 +
 
 +
step
 +
 
 +
wird auch in Funktionen hereingesprungen. Um die Ausführung wieder fortzusetzen gibt man einfach  
 +
cont
 +
(oder „continue“) ein.
 +
Ein  
 +
quit
 +
beendet GDB.