Christoph Kessler, IDA, Linköpings universitet, 2006. Feb. 2006 Fehlerbehandlung in...

24
Christoph Kessler, IDA, Linköpings universitet, 2006. Feb. 2006 Fehlerbehandlung in Programmiersystemen Fehler-Klassifikation Behandlung statischer Fehler Behandlung von Laufzeitfehlern Exception-Konzept Debugging Christoph Kessler Universität Linköping, Schweden

Transcript of Christoph Kessler, IDA, Linköpings universitet, 2006. Feb. 2006 Fehlerbehandlung in...

Page 1: Christoph Kessler, IDA, Linköpings universitet, 2006. Feb. 2006 Fehlerbehandlung in Programmiersystemen Fehler-Klassifikation Behandlung statischer Fehler.

Christoph Kessler, IDA, Linköpings universitet, 2006.

Feb. 2006

Fehlerbehandlungin Programmiersystemen

Fehler-Klassifikation Behandlung statischer Fehler Behandlung von Laufzeitfehlern

Exception-Konzept Debugging

Fehler-Klassifikation Behandlung statischer Fehler Behandlung von Laufzeitfehlern

Exception-Konzept Debugging

Christoph Kessler

Universität Linköping, Schweden

Page 2: Christoph Kessler, IDA, Linköpings universitet, 2006. Feb. 2006 Fehlerbehandlung in Programmiersystemen Fehler-Klassifikation Behandlung statischer Fehler.

2 Feb. 2006C. Kessler, IDA, Linköpings universitet.

Programmierfehler…

Ein erheblicher Teil der Gesamtkosten eines Softwareprojektesentfällt auf Testen, Fehlersuche und -behebung.

Welche Fehlertypen können auftreten?

Klassifikation

Prävention, Diagnose, Behandlung

Programmiersprachliche Konzepte

Compiler, IDE

Sonstige Werkzeuge: Debugger, Verifizierer, ...

Page 3: Christoph Kessler, IDA, Linköpings universitet, 2006. Feb. 2006 Fehlerbehandlung in Programmiersystemen Fehler-Klassifikation Behandlung statischer Fehler.

3 Feb. 2006C. Kessler, IDA, Linköpings universitet.

Programmierfehler – Klassifikation (1)

Syntaktische Fehler Syntaxfehler z.B. vergessenes Semikolon

Semantische Fehler Statische semantische Fehler

Statische Typfehler Falscher Parametertyp;Downcast ohne Laufzeit-

Überprüfung Nicht deklarierte Variable

Laufzeitfehler

Logische Fehler Algorithmische Fehler vergessener Spezialfall,

Nichtterminierung Numerische Fehler Akkumulation von Rundungsfehlern

Kontraktverletzung Verletzung geforderter Invarianten

Page 4: Christoph Kessler, IDA, Linköpings universitet, 2006. Feb. 2006 Fehlerbehandlung in Programmiersystemen Fehler-Klassifikation Behandlung statischer Fehler.

4 Feb. 2006C. Kessler, IDA, Linköpings universitet.

Programmierfehler – Klassifikation (2)

Laufzeitfehler – in der Regel nicht statisch prüfbar

Zugriffsfehler z.B.:

Arrayindex-Fehler Index out of bounds

Pointerfehler Dereferenziere NULL-Pointer

Arithmetische Fehler Division durch 0, Überlauf

I/O – Fehler unerwartetes Dateiende

Kommunikationsfehler Falscher Empfänger, falscher Typ

Synchronisationsfehler Daten-”race”, deadlock

Ressourcen-Erschöpfung Speicher, Zeitkonto

...

Bemerkung: Es gibt weitere Fehlertypen, und Kombinationen.

Page 5: Christoph Kessler, IDA, Linköpings universitet, 2006. Feb. 2006 Fehlerbehandlung in Programmiersystemen Fehler-Klassifikation Behandlung statischer Fehler.

5 Feb. 2006C. Kessler, IDA, Linköpings universitet.

Gegenmittel: Prävention, Diagnose, Behandlung Programmiersprache / Laufzeitsystem

Typsicherheit statische Typfehler

Exception-Konzept Laufzeitfehler

Automatische Speicherverwaltung Speicherlecks, Pointerfehler

Compiler-Frontend, IDE Syntaxfehler, statische semant. Fehler

Programmverifizierer Kontraktverletzung

Code-Inspektion [Fagan’76] Alle Fehlertypen

Testen und Debuggen Laufzeitfehler

Laufzeit-Schutzmonitor Zugriffsfehler

Visualisierer Kommunikationsfehler, Synchronisationsfehler

Page 6: Christoph Kessler, IDA, Linköpings universitet, 2006. Feb. 2006 Fehlerbehandlung in Programmiersystemen Fehler-Klassifikation Behandlung statischer Fehler.

6 Feb. 2006C. Kessler, IDA, Linköpings universitet.

Exception-Konzept

PL/I (IBM) ca. 1965: ON condition …

J. B. Goodenough, POPL’1975 und Comm. ACM Dez. 1975

In vielen modernen Programmiersprachen unterstützt

CLU, Ada, Modula-3, ML, C++, Java, C#

Überblick:

Fehler vs. Exception

Exception-Propagation

Geprüfte vs. ungeprüfte Exceptions

Implementierung

Exceptions in CORBA

Exceptions und Aspekt-orientierte Programmierung

Zusammenfassung und Literatur

Page 7: Christoph Kessler, IDA, Linköpings universitet, 2006. Feb. 2006 Fehlerbehandlung in Programmiersystemen Fehler-Klassifikation Behandlung statischer Fehler.

7 Feb. 2006C. Kessler, IDA, Linköpings universitet.

Exception-Konzept

2 Arten von Laufzeitfehlern:

Fehler (error): im Programm nicht behandelbar, Programmabbruch

Ausnahme (exception): im Programm (teilweise) behandelbar

Ausgelöst (thrown) durch Laufzeitsystem bei erkanntem Laufzeitfehler oder durch das Programm selbst

Nachricht an das Programm

Laufzeitobjekt, das eine ungewöhnliche oder Fehlersituation definiert

hat einen Typ (Exception-Klasse)

kann Parameter haben, z.B. String mit Klartextmeldung

Auch benutzerdefinierte Exceptions z.B. für Randfälle

Exception-Handler:

enthält Code-Block zur Behandlung

ist statisch assoziiert mit geschütztem Code-Block, den er im Ausnahmefall ersetzt

Page 8: Christoph Kessler, IDA, Linköpings universitet, 2006. Feb. 2006 Fehlerbehandlung in Programmiersystemen Fehler-Klassifikation Behandlung statischer Fehler.

8 Feb. 2006C. Kessler, IDA, Linköpings universitet.

Exception – Beispiel (in Java)

public class class1 {

public static void main ( String[] args ) {

try {

System.out.println("Hallo, " + args[0] );

}

catch (ArrayIndexOutOfBoundsException e ) {

System.out.println("Bitte ein Argument angeben! " + e);

}

System.out.println("Tschuess");

}

}

% java class1 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0at class1.main(class1.java:4)

% java class1 ChristophHallo, ChristophTschuess% java class1Bitte ein Argument angeben! java.lang.ArrayIndexOutOfBoundsException: 0Tschuess

Page 9: Christoph Kessler, IDA, Linköpings universitet, 2006. Feb. 2006 Fehlerbehandlung in Programmiersystemen Fehler-Klassifikation Behandlung statischer Fehler.

9 Feb. 2006C. Kessler, IDA, Linköpings universitet.

Propagation von Exceptions

Falls eine Exception nicht in der betroffenen Methode behandelt wird, wird die Methode verlassen und dieselbe Exception beim Aufrufer ausgelöst, bis entweder

ein passender Handler gefunden wird, oder

main() verlassen wird (dann Fehlermeldung und Abbruch).

Optionaler finally-Block wird jedoch immer ausgeführt

z.B. zur Rückgabe von Ressourcen

Zu klären:

Wann passt ein Handler?

Wie kann man statisch sicherstellen, dass eine bestimmte Exception irgendwann behandelt wird?

Implementierung?

Page 10: Christoph Kessler, IDA, Linköpings universitet, 2006. Feb. 2006 Fehlerbehandlung in Programmiersystemen Fehler-Klassifikation Behandlung statischer Fehler.

10 Feb. 2006C. Kessler, IDA, Linköpings universitet.

Wann ”passt” ein Handler? Exception-Klassenhierarchie

Benutzerdefinierte Exceptions durch Ableiten

Handler catch( XYException e ) {…}

passt, falls XYException vom gleichen Typ oder Supertyp der ausgelösten Exception ist.

Object

Throwable

Error Exception

RunTimeException

ArrayIndexOutOfBoundsE.

ArithmeticException

NullPointerException

IllegalAccessException

NoSuchMethodException

VirtualMachineError

ThreadDeath

Page 11: Christoph Kessler, IDA, Linköpings universitet, 2006. Feb. 2006 Fehlerbehandlung in Programmiersystemen Fehler-Klassifikation Behandlung statischer Fehler.

11 Feb. 2006C. Kessler, IDA, Linköpings universitet.

Geprüfte und ungeprüfte Exceptions

Geprüfte (checked) Exception: muss

in einer Methode behandelt, oder

in Methodendeklaration explizit als propagiert gekennzeichnet werden:

void writeEntry( … ) throws IOException { … }

Ungeprüfte (unchecked) Exception: wird implizit propagiert

In Java: Alle Exceptions sind geprüft, ausser RunTimeException und deren Subtypen.

Geprüfte Exceptions: + Kapselung + statische Prüfbarkeit + wird Teil des Kontrakts einer Methode + geeignet für Komponentensysteme, z.B. CORBA – Erweiterbarkeit

Page 12: Christoph Kessler, IDA, Linköpings universitet, 2006. Feb. 2006 Fehlerbehandlung in Programmiersystemen Fehler-Klassifikation Behandlung statischer Fehler.

12 Feb. 2006C. Kessler, IDA, Linköpings universitet.

-> catch(…)

-> catch(…)

-> catch(…)

Implementierung

Einfache Lösung: Stack von Handlern Bei Eintritt in geschützten Block (try {…}):

Pushe alle seine Handler (catch(…) {…}) Bei Auftreten einer Exception:

Poppe obersten Handler und beginne (Test auf Exceptiontyp).Falls der nicht passt, löse wieder aus und iteriere.(Falls letzter Handler in aktueller Methode auch nicht passte, poppe auch deren Activation record => verlasse Methode.)

Bei normalem Verlassen des try-Blocks: poppe seine Handler

+ einfach

– Overhead (push/pop) auch bei Nichtauftreten einer Exception

Effizientere Lösung: Compiler erzeugt Tabelle aus Paaren (try-Block, passende Handler)

Bei Auftreten einer Exception: finde try-Block durch Binärsuche (PC)

main:

foo:

-> catch(E2)

-> catch(E1)

bar:

void bar(…) { try { … } catch(E1 e) {…} catch(E2 e) {…} …}

Page 13: Christoph Kessler, IDA, Linköpings universitet, 2006. Feb. 2006 Fehlerbehandlung in Programmiersystemen Fehler-Klassifikation Behandlung statischer Fehler.

13 Feb. 2006C. Kessler, IDA, Linköpings universitet.

Exceptions in CORBA

CORBA IDL (Interface Definition Language)erlaubt benutzerdefinierte Exceptions

Sprachunabhängig

Propagation über Fernaufrufe hinweg

// IDLmodule BookRepository { … interface BorrowableCollection : Collection { exception Unavailable { Date when_available; } void borrow_book ( in ISBN book_id, in PersonName borrower, out Date return_date ) raises ( Unavailable ); };};

Page 14: Christoph Kessler, IDA, Linköpings universitet, 2006. Feb. 2006 Fehlerbehandlung in Programmiersystemen Fehler-Klassifikation Behandlung statischer Fehler.

14 Feb. 2006C. Kessler, IDA, Linköpings universitet.

Exceptions und AOP

Nachteil von Exception-Behandlung:

catch()-Blöcke stören Programmübersicht

Code-Länge

Idee für Java:Exception-Behandlung als Aspekt ausfaktorisieren,mit Aspect-J einweben

Systematischer durch generische Exceptionbehandlung

Kompression des Exception-Behandlungscode um ca. 75%

M. Lippert, C. Lopes: A Study on Exception Detection and Handling using Aspect-Oriented Programming. Proc. ICSE-2000, ACM.

Page 15: Christoph Kessler, IDA, Linköpings universitet, 2006. Feb. 2006 Fehlerbehandlung in Programmiersystemen Fehler-Klassifikation Behandlung statischer Fehler.

15 Feb. 2006C. Kessler, IDA, Linköpings universitet.

Zusammenfassung, Literatur

Exceptions

Bewährtes Konzept zur Behandlung von Laufzeitfehlern

Effizient implementierbar

Geeignet für komponentenbasierte Softwareentwicklung

M. Scott: Programming Language Pragmatics. Morgan Kaufmann, 2000.Abschnitt 8.5 über Exception Handling.

J. Goodenough: Structured Exception Handling. ACM POPL, Jan. 1975

J. Goodenough: Exception Handling: Issues and a proposed notation. Communications of the ACM, Dec. 1975

B. Ryder, M. Soffa: Influences on the Design of Exception Handling, 2003

Konferenzen ACM POPL und OOPSLA

Page 16: Christoph Kessler, IDA, Linköpings universitet, 2006. Feb. 2006 Fehlerbehandlung in Programmiersystemen Fehler-Klassifikation Behandlung statischer Fehler.

Christoph Kessler, IDA, Linköpings universitet, 2006.

Feb. 2006

Debugging

Debuggen vs. Testen

Debugging-Methoden und Werkzeuge

Debugger-Technologie

Debuggen nebenläufiger Programme

Zusammenfassung, Literatur

Page 17: Christoph Kessler, IDA, Linköpings universitet, 2006. Feb. 2006 Fehlerbehandlung in Programmiersystemen Fehler-Klassifikation Behandlung statischer Fehler.

17 Feb. 2006C. Kessler, IDA, Linköpings universitet.

Debugging

Testen: kann Existenz eines Fehlers feststellen(ohne Garantie auf Vollständigkeit!)

Vergleiche Ausgabe des Testkandidaten mit Referenzausgabe(z.B. älterer, korrekter Version – Regressionstesten, z.B. DEJAGNU)

Debuggen: lokalisiere Fehler: Ursache Effekt

Iterativer Prozess

Systematisches Eingrenzen

InitialeHypothesen-menge

ModifiziereHypothesen-menge

WähleHypo-these

VerifiziereHypo-these

Fehlerbeseitigt?

Fehler entdeckt

nein

ja

Page 18: Christoph Kessler, IDA, Linköpings universitet, 2006. Feb. 2006 Fehlerbehandlung in Programmiersystemen Fehler-Klassifikation Behandlung statischer Fehler.

18 Feb. 2006C. Kessler, IDA, Linköpings universitet.

Debugging-Techniken und Werkzeuge (1)

Manuelle Methoden

Statisch: Code-Inspektion

Dynamisch: print-Anweisungen, Validierung von Zusicherungen (assert() )

Werkzeuge für die manuelle Fehlersuche:

Symbolischer Debugger z.B. dbx, gdb, jdb, ddd

Debug-Problem-Dokumentation

z.B. BUGZILLA (Fehler-Datenbank + Web-Interface)

Laufzeit-Schutz-Monitorsystem ibs. für Zugriffsfehler

ElectricFence, VALGRIND, Java VM, INSURE++, PURIFY, …

Page 19: Christoph Kessler, IDA, Linköpings universitet, 2006. Feb. 2006 Fehlerbehandlung in Programmiersystemen Fehler-Klassifikation Behandlung statischer Fehler.

19 Feb. 2006C. Kessler, IDA, Linköpings universitet.

Debugging-Techniken und Werkzeuge (2) Automatisches Debugging:

Formale Verifikation gegen formale Spezifikation des Programms Oft keine oder unvollständige formale Spezifikation verfügbar Ggf. Spezifikation herleitbar, aber dann selbst fehleranfällig

Durchsuche Quellprogramm nach sprachspezifischen Fehler-Idiomen z.B. lint, splint, jlint unvollständig

Fehlersuchbereich eingrenzen durch statische Analyse: Program Slicing [Weiser’82] [Lyle, Weiser’87] Program Dicing (Differenz zweier Slices) [Lyle, Weiser’87] z.B. UNRAVEL slicer [Lyle’95] Braucht gute statische Analyse (DFA, points-to-Analyse) Konservative statische Approximation – Slices werden schnell gross

Delta-Debugging Automatisches Eingrenzen durch Binärpartitionierung

(Eingabedaten, Code)

Page 20: Christoph Kessler, IDA, Linköpings universitet, 2006. Feb. 2006 Fehlerbehandlung in Programmiersystemen Fehler-Klassifikation Behandlung statischer Fehler.

20 Feb. 2006C. Kessler, IDA, Linköpings universitet.

Symbolischer Debugger (1)

Braucht Information über Namen und Typ von Speicherstellen auf Quellcode-Niveau d.h., die Symboltabelle und Typtabelle des Compilers Wird bei Bedarf eingefügt (cc –g … )

Braucht Koordinaten der Programmpunkte im Quellcode (z.B. Zeilennr.) Braucht enge Kontrollfluss-Übereinstimmung

zwischen Quellcode und Maschinencode Unverträglich mit aggressiven Programmoptimierungen

z.B. Prefetching, Loop-invariant code hoisting, Schleifentransformationen, Scheduling

Trade-Off Code-Effizienz Debugger-Transparenz Kann unter gewissen Umständen dazu führen,

dass der Fehler mit Debugger nicht auftritt (gilt auch für print-debugging)

Graphische Oberfläche (z.B. ddd, Eclipse Debug-View)über Kommandozeilen-Debugger (z.B. dbx, gdb, jdb)

Page 21: Christoph Kessler, IDA, Linköpings universitet, 2006. Feb. 2006 Fehlerbehandlung in Programmiersystemen Fehler-Klassifikation Behandlung statischer Fehler.

21 Feb. 2006C. Kessler, IDA, Linköpings universitet.

Symbolischer Debugger (2)

Post-Mortem-Debugging

Nach Absturz: Lies core-file; inspiziere Speicherinhalt, Variablenwerte

Interaktives Debuggen

Berechnung anhalten

Breakpoints (Haltepunkte) setzen, löschen

Schritt-für-Schritt-Ausführung

Ausgabe von Werten, Ausdrucksauswertung (Interpreter)

Variablenwerte ändern

Aufrufkeller inspizieren

Aufrufkette entlangwandern

Page 22: Christoph Kessler, IDA, Linköpings universitet, 2006. Feb. 2006 Fehlerbehandlung in Programmiersystemen Fehler-Klassifikation Behandlung statischer Fehler.

22 Feb. 2006C. Kessler, IDA, Linköpings universitet.

Debugger-Technik mit OS/HW-Support

Debugger-Prozess Zu debuggender Prozess OS-IRC

fork() (via OS)

ptrace() (via OS): ”trace me”

signal() (via OS): ”stop”wait() (via OS)

ptrace() (via OS)

Lese, schreibe Werte im Adressraum;füge breakpoints (Spezialinstruktionen) in Code ein …

signal() (via OS): ”resume”

OS

trapFinde Breakpunkt:signal(): ”Breakpoint”

…signal(): ”continue”

Page 23: Christoph Kessler, IDA, Linköpings universitet, 2006. Feb. 2006 Fehlerbehandlung in Programmiersystemen Fehler-Klassifikation Behandlung statischer Fehler.

23 Feb. 2006C. Kessler, IDA, Linköpings universitet.

Debuggen nebenläufiger Programme

Problem: Auftreten des Fehlers kann vom Schedule abhängen

Nichtdeterminismus schwer, Fehler zu reproduzieren

Lösung 1: Deterministic replay Eingaben und Schedule aufzeichnen, z.B. DEJAVU für Java

Lösung 2: Statische Analyse (möglicher Parallelismus, ”Data-races”)

Lösung 3: Dynamische Analyse identifiziert shared-memory-Zugriffe zur Laufzeit

Lösung 4: Test-basierter Ansatz mit Delta-Debugging [Choi, Zeller ’02] In Kombination mit DEJAVU

Lauf 1: CPU

Lauf 2: CPU

Thread 1

Thread 1

Thread 1

Thread 1Thread 2 Thread 2

Thread 2 Thread 2 t

Page 24: Christoph Kessler, IDA, Linköpings universitet, 2006. Feb. 2006 Fehlerbehandlung in Programmiersystemen Fehler-Klassifikation Behandlung statischer Fehler.

24 Feb. 2006C. Kessler, IDA, Linköpings universitet.

Zusammenfassung und Literatur

Testen vs. Debuggen

Debugging-Methoden

Debugger-Technologie

Debuggen nebenläufiger Programme

M. Scott: Programming Language Pragmatics, Morgan Kaufmann 2000. Abschnitt über Debugging

Srikant, Shankar: Compiler Design Handbook, CRC press 2003,Kap. 9 über Debugger-Technologie (von Aggarwal und Kumar)

J. Rosenberg: How Debuggers Work. Wiley, 1996.

A. Zeller: Why Programs Fail. A Guide to Systematic Debugging. Morgan Kaufmann, 2005.

A. Zeller, J. Krinke: Open-Source Programmierwerkzeuge. Dpunkt, 2003.