Programmieren in Haskell Debugging Peter Steffen Universität Bielefeld Technische Fakultät 30.01.2009 1 Programmieren in Haskell
Debugger Definition laut Wikipedia: Ein Debugger (von engl. bug im Sinne von Programmfehler) ist ein Werkzeug zum Diagnostizieren, Auffinden und Beheben von Fehlern in Computersystemen, dabei vor allem in Programmen, aber auch in der für die Ausführung benötigten Hardware. 2 Programmieren in Haskell
Funktionen eines Debuggers Die Funktionen eines Debuggers sind im Wesentlichen: die Steuerung des Programmlaufs, insbesondere durch Haltepunkte und die Einzelschritt-Verarbeitung von Befehlen das Inspizieren von Daten das Modifizieren von Speichern, z.b. des Hauptspeichers das Auffangen von Rückmeldungen und Fehlerzuständen, z.b. Speicherzugriffsfehler, oder eine versuchte Division durch Null 3 Programmieren in Haskell
Gebräuchliche Debugger für imperative Sprachen GDB der GNU Debugger unterstützt C, C++, FORTRAN, Pascal, Modula-2 und Ada Der Debugger besitzt keine eigene grafische Oberfläche, sondern nutzt die Standard-Ein/Ausgabe grafische Debugging-Oberflächen, die den GDB als Backend verwenden: Eclipse-Plugin, ddd, cgdb Microsoft Visual Studio IDE unterstützt Visual Basic, C++ und C# Delphi IDE jdb Debugger für Java 4 Programmieren in Haskell
Braucht man für Haskell einen Debugger? Für Haskell gab es lange Zeit keine Debugging-Möglichkeiten. Gründe dafür sind: Das Typ-System eliminiert eine große Zahl von Fehlern schon während des Kompilierens. When the code compiles, it usually works Unit-Testen mit Quickcheck und HUnit erlaubt, individuelle Komponenten einer Software systematisch zu testen, so dass man sich einem Fehler relativ schnell annähern kann. Mit den interaktiven Umgebungen hugs und ghci kann man sehr einfach individuelle Funktionen testen 5 Programmieren in Haskell
Haskell Debugger Hat (http://www.haskell.org/hat). Der Code wird mit speziellem zusätzlichem Code für den Debugger kompiliert. Während der Laufzeit des Programms wird ein spezieller Trace in eine Datei geschrieben Diese Datei kann mit speziellen Browser-Werkzeugen angeschaut werden Nachteile: Alle Bibliotheken, die ein Programm verwendet, müssen extra für Hat kompiliert werden Hat unterstützt nur eine Untermenge von Haskell 98 Das Programm muss vollständig durchlaufen, bevor der Trace gespeichert werden kann. Wenn ein Programm nicht terminiert, funktioniert das nicht Hat hat hohe Laufzeitkosten, die Programme laufen etwa 50-150 mal langsamer 6 Programmieren in Haskell
Haskell Debugger Hood (http://www.haskell.org/hood). arbeitet nach dem gleichen Prinzip wie Hat. seit Juli 2000 nicht mehr weiterentwickelt. 7 Programmieren in Haskell
Haskell Debugger ghci debugger (http://www.haskell.org/ghc). seit Version 6.8 in den ghc integriert um den ghc in der Techfak verwendet zu können muss man ghc-6.10 der RCINFO-Liste (in der Datei.rcrc) hinzufügen arbeitet mit einem simplen, interaktiven Schema, der Benutzer kann die Ausführung eines Programms an beliebiger Stelle stoppen und sich die Werte von Variablen anzeigen lassen unterstützt einen Trace-Mode: der Debugger speichert jeden Reduktionsschritt, aber die Berechnung wird nur bei einem Breakpoint unterbrochen. Hier können dann die einzelnen Reduktionsschritte angezeigt werden Behandelt Exceptions (wie z.b. pattern match-fehler oder error) unterstützt alle Programme, die sich auch mit dem ghci verarbeiten lassen verlangsamt die Ausführung des Programms nur unwesentlich 8 Programmieren in Haskell
ghci Debugger wichtige Kommandos :break <zeile> Setzt einen Breakpoint. Das Programm wird an dieser Stelle unterbrochen :list Zeigt den Programmcode an der aktuellen Position an :set -fprint-evld-with-show benutzt die jeweilige show Funktion zum Anzeigen eines Wertes :print <Ausdruck> gibt den Wert des Ausdrucks aus, allerdings ohne diesen zu evaluieren :force <Ausdruck> evaluiert den Ausdruck und gibt ihn aus :continue führt die Berechnung nach einem Breakpoint weiter :show breaks zeigt die aktuellen Breakpoints an :delete <nummer> löscht einen Breakpoint :step führt einen einzelnen Reduktionsschritt durch :set stop :list zeigt nach jedem Reduktionsschritt automatisch den Quellcode an der aktuellen Position an :abandon bricht die aktuelle Berechnung ab 9 Programmieren in Haskell
ghci Debugger wichtige Kommandos :trace <Ausdruck> speichert alle Zwischenstufen der Berechnung bis zum Erreichen eines Breakpoints :hist zeigt die Zwischenstufen der Berechnung an (zusammen mit :trace) :back springt einen Reduktionsschritt zurück :forward springt einen Reduktionsschritt vor :set -fbreak-on-exception stoppt die Berechnung bei einer Exception (z.b. ein Pattern-Match-Fehler) 10 Programmieren in Haskell
Live Demo http://www.haskell.org/ghc/docs/latest/html/users_guide/ghcidebugger.html 11 Programmieren in Haskell