Kapitel 6. Debugger

Es kommt vor, dass ein Prüfablauf nicht wie geplant funktioniert. Der Debugger kann Ihnen bei der Fehlersuche helfen, indem Sie ein Testprogramm im Einzelschrittbetrieb, d.h. Zeile für Zeile, ausführen und die Reaktionen des Prüflings oder die Veränderung der Variablenwerte beobachten. Dieses Kapitel beschreibt die Verwendung des integrierten Debuggers.

6.1. Erste Schritte im Debugger

Wir werden die einzelnen Eigenschaften des Debuggers an einem kleinen Beispiel erläutern. In unserem Beispiel kommunizieren wir mit einem nicht näher bestimmten Prüfling. Wir senden dem Prüfling eine Zahl und der Prüfling soll genau mit dieser Zahl antworten. Das Senden übernimmt die Prozedur SendeZahl, das Empfangen die Prozedur EmpfangeZahl.

Mit diesen Prozeduren schreiben wir eine weitere Prozedur namens TesteZahl die genau eine Zahl sendet, eine Zahl empfängt und die empfangene Zahl mit der gesendeten vergleicht.

Im Hauptprogramm testen wir das Senden und Empfangen von 20 Zahlen. Das Projekt liegt den Winguard-Beispielprojekten bei und trägt den Namen Debuggerbeispiel. Wenn wir es laden und ausführen sehen wir, dass der erste Test erfolgreich durchgeführt wird, alle weiteren Tests aber fehlschlagen. Im folgenden wollen wir uns auf die Suche nach dem Problem machen.

6.1.1. Setzen von Breakpoints

Da der Fehler in der Prozedur TesteZahl auftritt beginnen wir unsere Suche dort. Dazu setzen wir einen Haltepunkt (auch Breakpoint) in die erste Zeile der Prozedur. Trifft Winguard bei der Ausführung des Programmes auf einen Haltepunkt, wird die Bearbeitung unterbrochen und die Entwicklungsumgebung angezeigt.

Um einen Breakpoint zu setzen, markieren wir im Editor die Zeile an der wir die Ausführung unterbrechen wollen und drücken die Taste F6. Eine Zeile mit Haltepunkt wird in der ersten Spalte mit einem roten Punkt markiert. Wenn wir nun das Programm starten wird die Ausführung in der Prozedur TesteZahl unterbrochen. Winguard wechselt in die Entwicklungsumgebung, zeigt die Prozedur an und markiert die Zeile mit dem Haltepunkt.

6.1.2. Variablen inspizieren

Bei der Fehlersuche ist es wichtig zu wissen, welche Werte die beteiligten Variablen haben. Um die Variablen zu betrachten öffnen wir die Anzeige der Überwachten Ausdrücke. Dies geschieht über die Tastenkombination Strg-W oder über das Icon images/ico_watches.png. Die Übersicht erscheint im unteren Bereich des Fensters. Sie ist in drei Fenster unterteilt: Überwachte Ausdrücke, Lokale Ausdrücke und Aufrufstack. Uns interessiert für diesen Augenblick nur die Anzeige der lokalen Ausdrücke. In ihr erscheinen alle Parameter und Variablen der aktiven Prozedur sowie alle Variablen des aktiven Ausdrucks.

Abbildung 6.1. Tabelle der lokalen Ausdrücke
images/dbg_localwatches.png

Die Tabelle zeigt zu jeder Variablen folgende Informationen: den Gültigkeitsbereich (Scope) der Variablen, den Namen der Variablen, ihren Typ sowie den aktuellen Wert.

6.1.3. Schrittweise Ausführung von Befehlen

An den überwachten Ausdrücken können wir erkennen, dass Variable Zahl den Wert 0 besitzt. Der erste Fehler trat allerdings erst bei einem Wert von 1 auf. Wir können mit der Taste F9 die Ausführung des Programmes fortsetzen. Winguard führt das Programm jetzt weiter aus und wird dann anhalten wenn es das nächste Mal auf unseren Haltepunkt trifft. Das ist im nächsten Schleifendurchlauf der Fall. In den lokalen Ausdrücken sehen wir, dass sich der Wert der Variablen Zahl auf 1 geändert hat.

Die Ausführung der Prozedur führt jetzt zu dem beobachteten Fehler. Wir wollen uns das Verhalten jetzt genauer ansehen. Mit der Taste F8 können wir die Befehle schrittweise ausführen und dabei die Änderung der Variablen beobachten. Drücken wir F8 springt die Markierung zur nächsten ausführbaren Zeile EmpfangeZahl(Rueckgabe);. Da vermutlich die Rückgabe einen falschen Wert liefert (schliesslich stammt der zu sendende Wert von uns) wollen wir uns jetzt diese Prozedur genauer ansehen. Drücken wir die Taste F7 wird die Ausführung in der Prozedur fortgesetzt.

Hier sehen wir dann auch den Fehler: die Zeile, die ein gelesenes Zeichen aus dem Puffer löscht fehlt. Fügen wir diese hinzu, gelingt der Test auch für die Werte 1 bis 20.