Bochs Debugger

Aus Lowlevel
Version vom 16. Januar 2010, 18:28 Uhr von Bjork (Diskussion | Beiträge) (Die Seite wurde neu angelegt: „Der Bochs interne Debugger stellt eine nützliche Hilfe beim Debuggen eines Betriebssystems dar, weil er unter anderem Registerinhalte, Speicher…“)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu:Navigation,

Der Bochs interne Debugger stellt eine nützliche Hilfe beim Debuggen eines Betriebssystems dar, weil er unter anderem Registerinhalte, Speicherinhalte oder auch disassemblierte Codestellen ausgeben kann.

Speicherinhalte ausgeben und manipulieren

Um sich den Speicherinhalt an einer bestimmten Adresse ausgeben zu lassen, verwendet man einen der folgenden Befehle:

<asm> x /nuf virtuelle_Adresse xp /nuf physikalische_Adresse </asm>

n, u und f bestimmen dabei die Ausgabe genauer:

  • n steht für die Anzahl der auszugebenen Einheiten
  • u für die Größe einer Einheit (b=1, h=2, w=4 und g=8 Bytes)
  • f legt das Ausgabeformat fest (d=dezimal, x=hexadezimal und t=binär)

Wenn Paging deaktiviert ist, dann bewirken beide Befehle dasselbe.

Möchte man geziehlt bestimmte Werte im Arbeitsspeicher verändern, nutzt man:

<asm> setpmem physikalische_Adresse Länge Wert </asm>

Dadurch wird der Arbeitsspeicher von der physikalischen Adressen an soweit mit dem Wert gefüllt, wie die Länge angibt.

Zudem kann auch der Inhalt des Stacks ausgegeben werden mit:

<asm> print-stack [Anzahl_Elemente] </asm>

Im Real Mode werden dabei Words, im Protected Mode Dwords ausgegeben.


Register ausgeben und manipulieren

Befehl auszugebene Register
reg alle Register
sreg Segment Register
dreg Debug Register
creg Control Register
info eflags EFLAGS Register
fpu FPU Register

Außerdem gibt es die Möglichkeit die allgemeinen Register zu verändern mit dem Befehl:

<asm> set Register = Wert </asm>

Code ausführen und ausgeben

Die Codeausführung kann man jederzeit mit Strg+C anhalten oder auch gezielt Breakpoints setzen:

<asm> vbreak segment:offset lbreak lineare_adresse </asm>

Auch gibt es die Möglichkeit Watchpoints an bestimmte Arbeitsspeicherstellen zu setzen. Wenn an diesen Stellen dann auf die Daten zugegriffen wird, wird die Codeausführung unterbrochen:

<asm> watch r/w physikalische_Adresse </asm>

Mit r (lesen) und w (schreiben) wird bestimmt, bei welcher Art von Zugriff unterbrochen wird.


Wird die Ausführung angehalten, dann gibt Bochs die aktuelle Codestelle automatisch disassembliert aus. Möchte man den Code dann weiterlaufen lassen, kann man entweder mit

<asm> cont </asm>

normal fortfahren oder mit

<asm> step [Anzahl_Schritte] </asm>

Einzelschritte ausführen lassen.

Sonstiges

  • Mit "quit" wird der Debugger beendet.
  • Mit "help" kann man sich die Liste der verfügbaren Befehle ausgeben.
  • Mit "show int" werden Interruptaufrufe ausgegeben.

Weblinks