Debugging — Änderungen 6897 → 7675

Zeile 10: Zeile 10:
 
Ähnlich wie bei der print(f)/cout-Methode kann man auch Daten/ASCII-Strings über die [[serielle Schnittstelle]] verschicken. Das hat den Vorteil, dass man mehr als nur 25 oder 50 Zeilen zeitgleich betrachten kann.
 
Ähnlich wie bei der print(f)/cout-Methode kann man auch Daten/ASCII-Strings über die [[serielle Schnittstelle]] verschicken. Das hat den Vorteil, dass man mehr als nur 25 oder 50 Zeilen zeitgleich betrachten kann.
  
−
Bei [[bochs]] werden die auf der seriellen Schnittstelle ausgegebenen Daten in eine Textdatei geschrieben, [[QEMU]] kann man mit einem Schalter veranlassen, die serielle Schnittstelle auf stdout oder in eine Datei umzuleiten. Diese kann später ggf. auch von weiteren Tools (z. B. grep) weiterverarbeitet werden.  
+
Bei [[bochs]] werden die auf der seriellen Schnittstelle ausgegebenen Daten in eine Textdatei geschrieben, [[QEMU]] kann man mit einem Schalter veranlassen, die serielle Schnittstelle auf stdout oder in eine Datei umzuleiten. Diese kann später ggf. auch von weiteren Tools (z. B. grep) weiterverarbeitet werden.  
  
 
Zudem ist ein Treiber für die serielle Schnittstelle sowohl im [[Real Mode]] als auch im [[Protected Mode]] relativ einfach zu schreiben. [[Interrupt | Interrupts]] müssen hierfür nicht verarbeitet werden können.
 
Zudem ist ein Treiber für die serielle Schnittstelle sowohl im [[Real Mode]] als auch im [[Protected Mode]] relativ einfach zu schreiben. [[Interrupt | Interrupts]] müssen hierfür nicht verarbeitet werden können.
Zeile 19: Zeile 19:
 
Bei bochs kann dazu der [[Bochs Debugger|integrierte Debugger]] benutzt werden.  
 
Bei bochs kann dazu der [[Bochs Debugger|integrierte Debugger]] benutzt werden.  
  
−
QEMU stellt keinen eigenen Debugger zur Verfügung, ermöglicht aber eine Verbindung mit einem externen (siehe [[GNU Project Debugger und QEMU]]). Oft braucht man aber in Verbindung mit QEMU gar keine komplexen Debug-Funktionen, wenn man nur an die Adresse kommen muss, an der eine Exception auftritt, es den "-d"-Schalter anbietet, um verschiedene Dinge zu loggen. Meist benötigt man ein "-d int", um alle Interrupts aufzuzeichnen. Dabei muss man aber ein wenig aufpassen, da ältere Versionen von QEMU bei einem Triplefault keinen Reset auslösen. Das heißt, er schreibt dann lauter GPFs in die Logdatei und diese wird dabei '''sehr''' groß. Man sollte den QEMU also möglichst schnell schließen, sobald ein Triplefault aufgetreten ist.
+
QEMU stellt keinen eigenen Debugger zur Verfügung, ermöglicht aber eine Verbindung mit einem externen (siehe [[GNU Project Debugger und QEMU]]). Oft braucht man aber in Verbindung mit QEMU gar keine komplexen Debug-Funktionen, wenn man nur an die Adresse kommen muss, an der eine Exception auftritt, es den „-d“-Schalter anbietet, um verschiedene Dinge zu loggen. Meist benötigt man ein „-d int“, um alle Interrupts aufzuzeichnen.
  
 
== Exception-Meldungen ==
 
== Exception-Meldungen ==
Zeile 28: Zeile 28:
  
 
== objdump ==
 
== objdump ==
−
Sobald die Adresse bekannt ist, muss man daraus auf die Codestelle schließen können. Dabei kann das GNU-Tool [[objdump]] eine große Hilfe sein. Dies ist aber nur möglich, wenn man ein Binärformat wie [[ELF]] benutzt, bei flachen Binaries fehlen dem Tool nötige Informationen (um einfach nur zu disassemblieren, kann man dann z. B. ndisasm, also den Disassembler von nasm, verwenden). objdump kann dabei mit dem Parameter -d Assemblercode mit Adresse vor jeder Instruktion generieren.
+
Sobald die Adresse bekannt ist, muss man daraus auf die Codestelle schließen können. Dabei kann das GNU-Tool [[objdump]] eine große Hilfe sein. Dies ist aber nur möglich, wenn man ein Binärformat wie [[ELF]] benutzt, bei flachen Binaries fehlen dem Tool nötige Informationen (um einfach nur zu disassemblieren, kann man dann z. B. ndisasm, also den Disassembler von nasm, verwenden). objdump kann dabei mit dem Parameter -d Assemblercode mit Adresse vor jeder Instruktion generieren.
  
 
=== Debuginformationen ===
 
=== Debuginformationen ===