| Zeile 1: | Zeile 1: | ||
| − | Der [[Bochs]] | + | Der [[Bochs|bochsinterne]] Debugger stellt eine nützliche Hilfe beim [[Debugging|Debuggen]] eines Betriebssystems dar, weil er unter anderem Registerinhalte, Speicherinhalte oder auch disassemblierte Codestellen ausgeben kann. |
== Speicherinhalte ausgeben und manipulieren == | == Speicherinhalte ausgeben und manipulieren == | ||
| Zeile 5: | Zeile 5: | ||
Um sich den Speicherinhalt an einer bestimmten Adresse ausgeben zu lassen, verwendet man einen der folgenden Befehle: | Um sich den Speicherinhalt an einer bestimmten Adresse ausgeben zu lassen, verwendet man einen der folgenden Befehle: | ||
| − | < | + | <pre>x /nuf virtuelle_Adresse |
| − | x /nuf virtuelle_Adresse | + | xp /nuf physikalische_Adresse</pre> |
| − | xp /nuf physikalische_Adresse | ||
| − | </ | ||
n, u und f bestimmen dabei die Ausgabe genauer: | n, u und f bestimmen dabei die Ausgabe genauer: | ||
| Zeile 19: | Zeile 17: | ||
Möchte man geziehlt bestimmte Werte im Arbeitsspeicher verändern, nutzt man: | Möchte man geziehlt bestimmte Werte im Arbeitsspeicher verändern, nutzt man: | ||
| − | < | + | <pre>setpmem physikalische_Adresse Länge Wert</pre> |
| − | 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. | Dadurch wird der Arbeitsspeicher von der physikalischen Adressen an soweit mit dem Wert gefüllt, wie die Länge angibt. | ||
| Zeile 27: | Zeile 23: | ||
Zudem kann auch der Inhalt des [[Stack|Stacks]] ausgegeben werden mit: | Zudem kann auch der Inhalt des [[Stack|Stacks]] ausgegeben werden mit: | ||
| − | < | + | <pre>print-stack [Anzahl_Elemente]</pre> |
| − | print-stack [Anzahl_Elemente] | ||
| − | </ | ||
Im [[Real Mode]] werden dabei Words, im [[Protected Mode]] Dwords ausgegeben. | Im [[Real Mode]] werden dabei Words, im [[Protected Mode]] Dwords ausgegeben. | ||
| Zeile 40: | Zeile 34: | ||
|- | |- | ||
|reg | |reg | ||
| − | | | + | |Alle [[Register]] |
|- | |- | ||
|sreg | |sreg | ||
| − | |Segment Register | + | |Segment-Register |
|- | |- | ||
|dreg | |dreg | ||
| − | |Debug Register | + | |[[Debug Register|Debug-Register]] |
|- | |- | ||
|creg | |creg | ||
| − | |Control Register | + | |[[Control Register|Control-Register]] |
|- | |- | ||
|info eflags | |info eflags | ||
| − | |EFLAGS | + | |[[EFLAGS]] |
|- | |- | ||
|fpu | |fpu | ||
| − | |FPU Register | + | |[[FPU]]-Register |
|} | |} | ||
Außerdem gibt es die Möglichkeit die allgemeinen Register zu verändern mit dem Befehl: | Außerdem gibt es die Möglichkeit die allgemeinen Register zu verändern mit dem Befehl: | ||
| − | < | + | <pre>set Register = Wert</pre> |
| − | set Register = Wert | ||
| − | </ | ||
== Code ausführen und ausgeben == | == Code ausführen und ausgeben == | ||
| Zeile 68: | Zeile 60: | ||
Die Codeausführung kann man jederzeit mit Strg+C anhalten oder auch gezielt Breakpoints setzen: | Die Codeausführung kann man jederzeit mit Strg+C anhalten oder auch gezielt Breakpoints setzen: | ||
| − | < | + | <pre>vbreak segment:offset |
| − | vbreak segment:offset | + | lbreak lineare_adresse</pre> |
| − | 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: | 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: | ||
| − | < | + | <pre>watch r/w physikalische_Adresse</pre> |
| − | watch r/w physikalische_Adresse | ||
| − | </ | ||
Mit r (lesen) und w (schreiben) wird bestimmt, bei welcher Art von Zugriff unterbrochen wird. | Mit r (lesen) und w (schreiben) wird bestimmt, bei welcher Art von Zugriff unterbrochen wird. | ||
| − | Wird die Ausführung angehalten, dann gibt | + | 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 | Möchte man den Code dann weiterlaufen lassen, kann man entweder | ||
mit | mit | ||
| − | < | + | <pre>cont</pre> |
| − | cont | ||
| − | </ | ||
normal fortfahren oder mit | normal fortfahren oder mit | ||
| − | < | + | <pre>step [Anzahl_Schritte]</pre> |
| − | step [Anzahl_Schritte] | ||
| − | </ | ||
Einzelschritte ausführen lassen. | Einzelschritte ausführen lassen. | ||