Bochs Debugger

Aus Lowlevel
Wechseln zu:Navigation, Suche

Der bochsinterne 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:

x /nuf virtuelle_Adresse
xp /nuf physikalische_Adresse

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:

setpmem  physikalische_Adresse  Länge  Wert

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:

print-stack [Anzahl_Elemente]

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
fpu FPU-Register

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

set Register = Wert

Code ausführen und ausgeben

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

vbreak segment:offset
lbreak lineare_adresse

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:

watch r/w physikalische_Adresse

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

cont

normal fortfahren oder mit

step [Anzahl_Schritte]

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