Vorlesung Programmieren

Ähnliche Dokumente
Vorlesung Programmieren

fungen Debugging Boris Tripolskij

Programmieren in Haskell Debugging

Testen und Debugging

Vom Testkonzept zu JUnit

Vorlesung Programmieren

Vorlesung Programmieren

Vorlesung Programmieren

Software Engineering. Validierung und Verifikation. Martin Glinz Harald Gall. Kapitel 7. Universität Zürich Institut für Informatik

Kennenlernen. Tutorium 7 iloveswt.de Fabian I. Miltenberger INSTITUT FÜR PROGRAMMSTRUKTUREN UND DATENORGANISATION (IPD)

Praktikum zu Einführung in die Informatik für LogWings und WiMas Wintersemester 2013/14

Software Engineering, SoSe 07, WSI, D. Huson, (Original Author: A. Zeller), 4. Juni

Validierung und Verifikation!

Validierung und Verifikation

Vorlesung Programmieren

Testplan. Hochschule Luzern Technik & Architektur. Software Komponenten FS13. Gruppe 03 Horw,

DAP2 Praktikum Blatt 2

ERSTELLUNG EINES KONZEPTS ZUM TESTEN DER PERFORMANCE VON JAVA CODE MIT HILFE DER FRAMEWORKS JUNIT UND TESTNG

Übungspaket 12 Der Datentyp char

Eine kleine Anleitung zum Programmieren mit MATLAB

Vorlesung Programmieren

Testen von SOA-Anwendungen mit dem BPEL Testframework

Code und Qualität 2: Testing

Test-Strategien. Grundsätzliches Blackbox-Testen Whitebox-Testen Graybox-Testen Ablauf von Tests Zusammenfassung. HS Mannheim

Informatik I Debugging

Programmieren I. Entwicklungsumgebungen Eclipse, NetBeans und IntelliJ IDEA. Institut für Angewandte Informatik

Vorlesung Programmieren

Tag 6 Repetitorium Informatik (Java)

Technische Informatik für Ingenieure WS 2010/2011 Übungsblatt Nr. 3

1 Programmierfehler und ihre Behebung

Online Assistent für CANoe oder CANalyzer Abstürze

Technische Informatik für Ingenieure WS 2010/2011 Musterlösung Übungsblatt Nr. 3

Programmieren I. Entwicklungsumgebungen Eclipse, NetBeans und IntelliJ IDEA. Institut für Angewandte Informatik

Erster Bug: eine Motte

Installation von 3M KODIP-SF mit Fallerfassung Version Dezember 2016

Informatik I Übung, Woche 41

Das diesem Dokument zugrundeliegende Vorhaben wurde mit Mitteln des Bundesministeriums für Bildung und Forschung unter dem Förderkennzeichen

Fehlertolerante Systeme

Vorlesung Programmieren

Vorlesung Programmieren

6 Produktqualität Systeme: Integrationstest [sehr stark gekürzt]

Mit Fehlerkennzahlen Software-Entwicklungsprozesse verbessern - Erfahrungen bei der IDG -

Suchen und Sortieren

Modul Softwareentwicklung

Übungspaket 9 Logische Ausdrücke

APPS für ios 10. professionell entwickeln. Apple Watch

Dr. Hanno Schauer Mons-Tabor-Gymnasium Montabaur. Debugging-Aufgaben. Aus Programmfehlern lernen

EIDI 1 Einführung in die Informatik 1. PGdP Praktikum Grundlagen der Programmierung. Harald Räcke 2/217

Programmieren. Wie entsteht ein Programm

Student: Alexander Carls Matrikelnummer: Aufgabe: Beschreibung des euklidischen Algorithmus Datum:

Entwurfsmuster und Softwarearchitekturen für sicherheitskritische Systeme

Vorlesung Projektmanagement und Teamorganisation. Dr. Bernhard Schätz Leopold-Franzens Universität Innsbruck Sommersemester 2003

Property Based Testing

Suchen und Sortieren

Ein kleiner Blick auf die generische Programmierung

Vorlesung Programmieren

Programmieren mit Edipse 3

EasyWebNG - Screenshots

JUnit. Software-Tests

SOFTWARE ENGINEERING 3 TESTVORBEREITUNGEN UND UNIT-TEST

RO-Tutorien 3 / 6 / 12

Qualitätssicherung von Software

JUnit (Version 4.x) Framework zur Unterstützung von Unit-Tests. Wir verwenden nicht JUnit 3.x. Ideen dahinter. Test-Methode

1.1 Datenbankprogramm Oracle für MCIS MDA

Informatik I Übung, Woche 41

Framework zur Unterstützung von Unit-Tests

Unit Tests und Fehlersuche

Vorlesung Programmieren

Visual Basic Express Fehlerermittlung

Grundlagen in LabWindows TM /CVI

5. Übung - Kanalkodierung/Programmierung

Ideen der Informatik Suchen und Sortieren [Ordnung muss sein ] Kurt Mehlhorn Adrian Neumann viele Folien von Kostas Panagiotou

Fehlertoleranz in eingebetteten Systemen

Value Delivery and Customer Feedback

Objektorientierte Programmierung. Kapitel 22: Aufzählungstypen (Enumeration Types)

UI-Testing mit Microsoft Test Manager (MTM) Philip Gossweiler /

Test & Diagnose digitaler! Systeme,! Prüffreundlicher Entwurf.!

Testphase. Das Testen

Deductive Software Verification The KeY Book Haupt- und Proseminar in SoSe 2017

Beispiel: Schriftliche Addition

Name: Klausur Programmierkonzepte SS 2011

Informationsverarbeitung

Fachgebiet Informationssysteme Prof. Dr.-Ing. N. Fuhr. Programmierung Prof. Dr.-Ing. Nobert Fuhr. Übungsblatt Nr. 10

Inhaltsverzeichnis. Vorwort.11

VBA mit Microsoft Excel für Kids

NICHT TRIVIAL: MAKROVARIABLEN - GLOBAL ODER LOKAL

Software(technik)praktikum: SVN-Tutorial

Programmverstehen 3: Detailliertes Verständnis. Dr. Thorsten Arendt Marburg, 10. Dezember 2015

Einführung Praktische Informatik

Re-Engineering: Test-First-Ansatz. Dr. Thorsten Arendt Marburg, 17. Dezember 2015

Einführung in die Informatik I Kapitel II.3: Sortieren

Ist Qualität nachrüstbar? Testen, Dokumentation und Code Qualität von Anfang an

Ideen und Konzepte der Informatik. Programme und Algorithmen Kurt Mehlhorn

Anleitung Redmine. Inhalt. Seite 1 von 11. Anleitung Redmine

Theoretische Grundlagen der Informatik

Intensivübung zu Algorithmen und Datenstrukturen

Software Engineering II (IB) Testen von Software / Modultests

Übungspaket 23 Mehrdimensionale Arrays

Transkript:

Vorlesung Programmieren 16 Finden und Beheben von Fehlern Prof. Dr. Ralf H. Reussner Version 1.0 LEHRSTUHL FÜR SOFTWARE-DESIGN UND QUALITÄT (SDQ) INSTITUT FÜR PROGRAMMSTRUKTUREN UND DATENORGANISATION (IPD), FAKULTÄT FÜR INFORMATIK sdq.ipd.kit.edu KIT Universität des Landes Baden-Württemberg und nationales Forschungszentrum in der Helmholtz-Gemeinschaft www.kit.edu

Literaturhinweis - Weiterlesen Steve McConnell Code Complete, 2. Edition, Microsoft Press Kapitel 23 Debugging 2

Der Begriff Bug Wenn Debugging der Vorgang ist, Fehler auszubauen, dann ist Programmieren wohl der Vorgang Fehler einzubauen. (Anonymus) Begriff Bug seit Ende des 19 Jahrhunderts in Amerika umgangssprachlich für Konstruktionsfehler. 9.9. 1945 First actual case of bug being found (Grace Hopper, Mark II Aiken Computer) Sonderfall: Heisenbug: verschwindet beim Debugging Bohrbug: normaler Bug (deterministisch) Quelle Wikipedia 3

Failure Fault Defect Error Bug Error: Ein Fehler bei der Entwicklung Defect: Ein Error, der durch Testen gefunden wurde. Bug: Ein Defect, der von den Entwicklern anerkannt wurde. Fault: Software-Zustand, der durch einen Error, Bug, Defect oder Fehler verursacht wurde. Failure: Unterschied zum von der Software erwarteten Verhalten zur Laufzeit (z.b. Absturz, Ausfall) [Jean-Claude Laprie] 4

Debugging Was ist Debugging? Debugging besteht aus Finden und Beheben von Fehlern. Normalerweise ist Finden und Verstehen eines Fehlers 90% des Debugging Aufwandes. (à Korrektur einfacher) Ein effizienter Programmierer kann durch wissenschaftliche Methoden die Fehler debuggen, während ein ineffizienter Programmierer unsystematisch nach den Fehlern sucht. è Wesentlicher Faktor für die unterschiedliche Produktivität von Software- Entwicklern. (ca. 1 zu 20). 5

Schritte der klassischen wissenschaftlichen Methode Erfassen der Daten durch reproduzierbare Experimente Formulieren einer Hypothese, die die relevanten Daten wiederspiegelt. Entwerfen eines Experimentes zur Überprüfung der Hypothese Überprüfung der Hypothese Bei Bedarf das Experiment wiederholen oder weiterentwickeln durch verfeinerte Hypothese 6

Wissenschaftliche Methode angewendet auf Debugging Stabilisieren des Fehlers Lokalisieren der Ursache des Fehlers (auch fault genannt) Erfassen der Daten, die zum Fehler führen Analyse der erfassten Daten Formulieren der Hypothese über den Defekt Identifizieren einer Methode zur Überprüfung der Hypothese Testen Durchsuchen des Codes Überprüfen der Hypothese durch eine der beiden Methoden Beheben des Fehlers Testen, ob der Fehler tatsächlich behoben wurde Suche nach ähnlichen Fehlern 7

Debugging Stabilisieren des Fehlers (1) Der Schwerpunkt liegt auf Reproduzierbarkeit eines Fehlers Stabilisieren des Fehlers è Einfache Fehlerdiagnose Ein Fehler, der nicht vorhersagbar ist, ist normalerweise ein Initialisierungsfehler, ein zeitliches Problem oder ein hängender Zeiger (Letzteres kommt in Java nicht vor). Beispiel: Wenn die Summe zweier Variablen randomisiert falsch oder richtig ist è Eine der Variablen wird mit hoher Wahrscheinlichkeit nicht richtig initialisiert. Wenn Sie beim Programmieren Zeiger benutzen è Der Zeiger ist falsch initialisiert oder der Speicherplatz, worauf der der Zeiger zeigt, ist nicht mehr aktuell. 8

Debugging Stabilisieren des Fehlers (2) Stabilisieren des Fehlers besteht aus Finden eines Testfalls Vereinfachen des Testfalls zum einfachsten Testfall, der zum Fehler führt. Vereinfachen eines Testfalls bedeutet, dass Ändern des kleinsten Aspekts des Testfalls zum Ändern des Verhaltens des Fehlers führt. Fehlerdiagnose durch: Ändern des vereinfachten Testfalls Beobachten des Programmverhaltens 9

Debugging Lokalisieren der Fehlerursache (1) Ermitteln der Testdaten, die zum Fehler führen Analyse der ermittelten Daten Formulieren einer Hypothese über die Fehlerursache basierend auf den Daten Überprüfung der Hypothese durch einen Testfall oder Inspektion des Codes. 10

Debugging Lokalisieren der Fehlerursache (2) 1. Beispiel für das Formulieren einer Hypothese basierend auf dem vereinfachten Testfalls: Es gibt 10 Faktoren, die zusammen zu einem Fehler führen Formulieren einer Hypothese über die irrelevanten Faktoren Ändern des jeweiligen irrelevanten Faktors und beobachten des Code- Verhaltens Tritt der Fehler immer noch auf è Kann der Faktor tatsächlich eliminiert werden. è Der Testfall ist vereinfacht. Tritt der Fehler nicht mehr auf è Der Faktor ist relevant und die Hypothese muss korrigiert werden. 2. Beispiel für das Lokalisieren eines Fehlers: Hypothese: Der Fehler liegt innerhalb eines Wertebereichs Zur Überprüfung der Hypothese müssen drei Werte überprüft werden innerhalb des Wertebereich die Grenzen des Wertebereichs außerhalb des Wertebereichs 11

Tipps für die Fehlersuche (1) Einsatz aller verfügbaren Daten für die Formulierung der Hypothese Grund: Eine Hypothese betrifft nicht nur einen Fall, sondern eine Klasse von Fällen Beispiel: Hypothese: alle Wörter, die mit T anfangen, können in der Datenbank nicht richtig sortiert werden. Die Hypothese betrifft die Klasse der Wörter, die mit T anfangen Werden Daten gefunden, die gegen die Hypothese sprechen è Die Daten nicht ignorieren è Hypothese korrigieren Seien zwei Hypothese A und B gleichzeitig richtig und Hypothese A sei allgemeiner als Hypothese B. è Es ist ausreichend, wenn nur die präzisere Hypothese überprüft wird. 12

Tipps für die Fehlersuche (2) Verfeinerung der Testfälle, die zum Fehler führen Kann die Fehlerursache nicht durch die Testfälle identifiziert werden Die Testfälle müssen weiter verfeinert werden. è Die Parameter müssen jeweils mehr verändert werden, als bisher angenommen. è Das Programmverhalten muss dabei beobachtet werden. 13

Tipps für die Fehlersuche (3) Benutzen von Unit Tests Fehler können einfacher in kleinen Programmabschnitten gefunden werden Mit Hilfe von Unit Tests können verschiedene Programmabschnitte in Isolation beobachtet werden. 14

Tipps für die Fehlersuche (4) Benutzen vorhandener Werkzeuge Es gibt bereits diverse Werkzeuge zur Fehlersuche Beispiele: interaktive Debugger Compiler Werkzeuge zur Überprüfung der Werte in den Speicherzellen Beispiel für einen Fall, bei dem ein solches Werkzeug nützlich ist: Ein Teil des Programms überschreibt die Ergebnisse anderer Programmteile Analytisch schwer durch den Programmierer ohne Werkzeug überprüfbar Mit Hilfe von Debugger kann ein Checkpoint für die bestimmte Speicheradresse gesetzt werden. 15

Tipps für die Fehlersuche (5) Reproduzieren eines Fehlers auf verschiedene Art und Weise Der Fehler soll durch mehrere nicht identische Testfälle lokalisiert werden Grund: Die Fehlerursache kann so am besten identifiziert werden. Zum Abschluss: Konstruieren eines weiteren Testfalls, der nicht zu einem Fehler führen sollte.è Dieser führt in der Realität zu einem Fehler è Die Fehlerursache wurde noch nicht identifiziert. keinem Fehler è Die Fehlerursache wurde eventuell korrekt identifiziert. Vorsicht bei Fehlern, die mehr als eine Fehlerursache haben. Programm Programm Programm Programm Fehler Fehler Fehler Fehler 1. Test 2. Test 3. Test Darauffolgende Tests 16

Tipps für die Fehlersuche (6) Generieren von weiteren Daten bei der Formulierung der Hypothese Generieren von zusätzlichen Testfällen, die sich von Testfällen unterschieden, bei denen ersichtlich ist, dass sie fehlschlagen. Diese Testfälle dienen zur Generierung von zusätzlichen Daten Benutzen der neuen Daten zum Verschärfen der Hypothese 17

Tipps für die Fehlersuche (7) Benutzen der negativen Tests Beispiel: Ein Test widerlegt eine Hypothese è Die Fehlerursache liegt nicht an einer anderen Stelle im Programm è Diese Information hilft beim Einschränken der Suche 18

Tipps für die Fehlersuche (8) Brainstormen über mögliche Hypothesen Nicht nur eine, sondern viele mögliche Hypothesen formulieren Alle Hypothesen werden zunächst formuliert. Überprüfen von Hypothesen durch Konstruieren von Testfällen 19

Tipps für die Fehlersuche (9) Erstellen einer Liste aller Methoden/Aktivitäten für Debugging Ist eine Methode nicht erfolgreich, wird die nächste Methode ausprobiert. 20

Tipps für die Fehlersuche (10) Eingrenzen der Fehlerregion im Code Statt das gesamte Programm zu testen, werden nur Teile vom Programm getestet 1. Methode: Eingrenzen der Fehlerregion durch print-anweisungen, Log- und Tracing-Daten 2. Methode: Teile des Programms nacheinander entfernen Analog zur binären Suche immer die Hälfte des Codes Beobachten des Programmverhaltens: Tritt der Fehler immer noch auf, liegt der Fehler im Code-Bereich, der noch nicht entfernt wurde. Tritt der Fehler nicht mehr auf, liegt der Fehler im Code-Bereich, der entfernt wurde. Beispiel: Auskommentieren des Codes, Breakpoints mit Debugger 21

Tipps für die Fehlersuche (11) Vorsicht bei Klassen, die bisher Fehler enthielten Klassen und Routinen, die in der Vergangenheit fehlerhaft waren, sind mit hoher Wahrscheinlichkeit auch in Zukunft fehlerhaft. Fehleranfällige Klassen müssen erneut überprüft werden. 22

Tipps für die Fehlersuche (12) Überprüfen des sich häufig ändernden Codes Wenn es einen schwer auffindbaren Fehler im Code gibt, liegt der Fehler normalerweise im neu geschriebenen Code oder in der Different zwischen dem alten und dem neuen Code Diff-Werkzeuge Version Controll Logs Ausführen des alten Codes und Beobachten des Programmverhaltens 23

Tipps für die Fehlersuche (13) Erweitern der zu beobachtenden Coderegion Beginn der Suche mit einer kleinen Coderegion Liegt der Fehler nicht in der Coderegion è Erweitern der Coderegion mit Hilfe der binären Suche 24

Tipps für die Fehlersuche (14) Inkrementelle Integration Integration kleiner Programmstücke Ist der Code nach der Integration des Programmstücks fehlerhaft è Entfernen und Testen des neuen Programmstücks 25

Tipps für die Fehlersuche (15) Überprüfen auf häufig vorkommende Fehler Anlegen einer feingranularen Checkliste zur Qualitätskontrolle angepasst an die Entwicklungsumgebung Anwenden der bereits existierenden Checklisten 26

Tipps für die Fehlersuche (16) Sprechen mit einem Dritten über das Problem Der Programmierer kann seine Fehler am besten entdecken, wenn er darüber mit einem Dritten spricht. è Distanz zwischen dem Programmierer und dem Problem 27

Tipps für die Fehlersuche (17) Eine Pause machen! Eine Pause hilft oft bei der Fehlersuche. 28

Tipps für die Fehlersuche (18) Brute-Force Debugging Brute-Force ist ein Verfahren, das wenig beachtet wird. Dieses Verfahren ist schwierig, anstrengend und zeitaufwendig, garantiert jedoch die Fehlerbehebung Es gibt diverse Techniken, die fallabhängig eingesetzt werden können: Organisieren eines vollständigen Entwurfs und/oder Code-Review des fehlerhaften Codes Ignorieren des fehlerhaften Codes. è Neuentwurf und Neuprogrammieren Compilieren des Programms samt der Debugging Information Ändern des Warning-Levels beim Compilieren und Korrigieren aller Warnings Unit Tests für den neugeschriebenen Code Schreiben einer automatischen Test Suite. Langes Ausführen der Tests Manuelles Durchlaufen einer großen Schleife mit Hilfe vom Debugger Instrumentieren des Codes Replizieren der kompletten Konfiguration des Endbenutzers Integration kleiner komplett getesteter Programmstücke 29

Syntaxfehler Nie Bezeichner mit nur einer Zeichen-Differenz wählen (z.b. x-coord, y- coord), denn so können Tippfehler leicht wieder zu legalen Bezeihnern führen. Tipps beim Benutzen von Compilern: Verlassen Sie sich nicht unbedingt auf die Zeilennummer in der Compilernachricht. Verlassen Sie sich nicht unbedingt auf die Compilernachricht. Verlassen Sie sich nicht unbedingt auf die sekundäre Nachrichten einer Fehlerkaskade Devide and Conquer 30

Zusammenfassung Debugging besteht aus Finden und Beheben von Fehlern. Einführung einer wissenschaftlichen Methode für Debugging Stabilisieren des Fehlers Lokalisieren der Ursache des Fehlers (auch fault genannt) Beheben des Fehlers Testen, ob der Fehler tatsächlich behoben wurde. Suche nach ähnlichen Fehlern Tipps für die Fehlersuche Benutzen aller verfügbaren Daten für die Formulierung der Hypothese Verfeinerung der Testfälle, die zum Fehler führen Benutzen von Unit Tests Benutzen vorhandener Werkzeuge Reproduzieren eines Fehlers auf verschiedenen Art und Weise Generieren von mehr Daten bei der Formulierung der Hypothese Benutzen der negativen Tests Brainstormen über mögliche Hypothesen Brute Force 31