Informatik · Klasse 5–10 · aktualisiert
Debugging: Fehler systematisch finden und beheben
Du lernst, wie Testen und Debuggen zusammenhängen, welche Fehlerarten es gibt und wie du Fehler Schritt für Schritt findest.
0 von 11 Aufgaben gelöst
Kurz gesagt
Debuggen heißt, Fehler in einem Programm zu finden und zu beheben. Testen prüft dagegen, ob das Ergebnis stimmt. Du stellst den Fehler zuerst nach, grenzt ihn mit Zwischenausgaben oder Haltepunkten ein und wiederholst danach die Tests.
Dein Spiel stürzt ab oder zählt falsche Punkte. Solche Fehler heißen Bugs. Die Suche nach Bugs nimmt einen großen Teil der Entwicklungszeit in Anspruch. Hier lernst du, wie du dabei ordentlich vorgehst.
Deine Lernziele
Hake ab, was du schon kannst. Löst du alle Aufgaben eines Abschnitts, hakt Mela das Ziel für dich ab.
4 Abschnitte
Ein Programm kann Fehler haben, sogenannte Bugs. Zwei Tätigkeiten helfen dir dabei: Testen und Debuggen.
Beim Testen prüft und bewertet man ein Programm. Man vergleicht das Ist-Ergebnis mit dem Soll-Ergebnis. Das Ist-Ergebnis ist das, was das Programm wirklich liefert. Das Soll-Ergebnis ist das, was herauskommen soll. Danach steht fest: ok oder Fehler. Ein Test zeigt dir also, dass etwas nicht stimmt.
Beim Debuggen geht es um den nächsten Schritt. Man diagnostiziert den Fehler oder das unerwartete Verhalten, man sucht also die Ursache, und man behebt den Fehler. Das deutsche Wort dafür ist „entwanzen“. Beides gehört zusammen: Ein Test zeigt eine Abweichung, dann wird debuggt, danach wird wieder getestet.
Definition
Debuggen
Debuggen (auch Fehlerbehebung) heißt, in einem Computerprogramm Fehler oder unerwartetes Verhalten zu diagnostizieren und zu beheben.
Beispiel: Ausgedachtes Beispiel: Münzen im Spiel
- 1Test: Du sammelst 3 Münzen. Soll-Ergebnis: 3 Punkte. Das Spiel zeigt 30 Punkte.
- 2Das Testen zeigt: Ist und Soll sind verschieden, also gibt es einen Fehler.
- 3Debuggen: Du suchst die Stelle, an der die Punkte falsch berechnet werden, und behebst den Fehler.
- 4Danach testest du noch einmal.
Merke: Testen vergleicht Ist- und Soll-Ergebnis. Debuggen sucht die Ursache eines Fehlers und behebt ihn.
Teste dich
Es gibt drei Arten von Fehlern.
Ein Syntaxfehler verstößt gegen die grammatischen Regeln der Programmiersprache, zum Beispiel durch eine fehlende Klammer oder ein fehlendes Semikolon. Ein Übersetzungsprogramm (Compiler) oder ein Interpreter weist ein solches Programm zurück. In der Regel entsteht dann kein ausführbarer Code, das Programm kann also nicht laufen. Die Zeilennummer in der Fehlermeldung zeigt oft den ungefähren Ort.
Ein Laufzeitfehler tritt auf, während das Programm läuft. Typische Beispiele sind Division durch Null oder eine fehlende Datei, aus der das Programm Daten holen soll. Das Programm kann dabei abstürzen, falsche Ergebnisse liefern oder sich nicht vorhersehbar verhalten. Auch ein „korrektes“ Programm kann bei der Ausführung zu Fehlern führen.
Bei einem Logikfehler läuft das Programm vollständig, aber die Ausgabe oder das Verhalten entspricht nicht den Erwartungen des Programmierers. Beispiele sind plus statt minus oder kleiner statt kleiner/gleich. Diese Art von Fehlern ist schwerer zu finden und zu beheben.
Achtung: Manche Autoren nennen auch logische Fehler, die zur Laufzeit ohne Abbruch auftreten, Laufzeitfehler. Hier gilt: Läuft das Programm vollständig und nur das Ergebnis stimmt nicht, sprechen wir von einem Logikfehler.
| Fehlerart | Woran du sie erkennst | Beispiel |
|---|---|---|
| Syntaxfehler | Das Programm wird zurückgewiesen, die Meldung nennt oft die Zeile | Fehlende Klammer oder fehlendes Semikolon |
| Laufzeitfehler | Der Fehler tritt auf, während das Programm läuft | Division durch Null |
| Logikfehler | Das Programm läuft vollständig, aber das Ergebnis stimmt nicht | Plus statt minus |
Beispiel: Drei ausgedachte Programme
- 1Programm A: Eine schließende Klammer fehlt. Das Programm startet nicht, eine Fehlermeldung erscheint. Das ist ein Syntaxfehler.
- 2Programm B: Es teilt 10 durch eine eingegebene Zahl. Jemand gibt 0 ein, und das Programm kann abstürzen. Das ist ein Laufzeitfehler (Division durch Null).
- 3Programm C: Es soll 8 minus 3 rechnen, rechnet aber 8 plus 3 und zeigt 11. Das Programm läuft vollständig, das Ergebnis stimmt nicht. Das ist ein Logikfehler.
Merke: Syntaxfehler brechen die Regeln der Sprache. Laufzeitfehler treten beim Ablauf auf. Beim Logikfehler läuft das Programm vollständig, aber das Ergebnis stimmt nicht.
Teste dich
In der Regel ist der erste Schritt beim Debuggen, das unerwünschte Verhalten nachzustellen. Das Fachwort dafür ist „reproduzieren“. Das ist nicht immer leicht. Ein Bericht wie „das blöde Programm funktioniert nicht!“ ist viel zu allgemein. Auch „ich kann mich nicht mehr an die Fehlermeldung erinnern“ hilft kaum. Manche Fehler lassen sich nur schwer oder gar nicht zuverlässig nachstellen. Wiederholst du den Vorgang unter scheinbar gleichen Bedingungen, kann der Fehler ausbleiben.
Danach grenzt du den Fehler ein. Dafür gibt es drei Wege.
Zwischenausgaben: Du fügst Programmzeilen hinzu, die Zwischenergebnisse ausgeben, auf den Bildschirm oder in eine Logdatei (eine Datei, in die das Programm Meldungen schreibt). So findest du heraus, in welchem Schritt einer Berechnung ein Problem auftaucht oder wo das Programm unerwartet abbricht. Dabei kannst du den Bereich Schritt für Schritt kleiner machen, zum Beispiel erst in der Mitte des Programms nachsehen. Diese einfache Methode funktioniert nur bei „klassischen“ Bugs: Das Ergebnis ist offensichtlich falsch, oder das Programm stürzt bei einer bestimmten Eingabe reproduzierbar ab.
Haltepunkte: Ein Debugger ist ein Werkzeug zum Finden von Fehlern. Oft ist er Teil der Entwicklungsumgebung, in der man programmiert. Du setzt einen Haltepunkt (englisch Breakpoint) im Programmtext. Dort unterbricht das Programm. Dann kannst du den Zustand prüfen und Variablen ansehen. Ein bedingter Haltepunkt unterbricht nur dann, wenn die Zeile erreicht wird und eine von dir angegebene Bedingung wahr ist.
Schrittweise Ausführung: Du lässt das Programm Zeile für Zeile laufen, um schnell unerwartete Sprünge zu finden.
Beispiel: Ausgedachtes Beispiel: Der Preis stimmt nicht
- 1Ein Programm soll aus 3 Stück zu je 2 Euro den Preis 6 Euro berechnen. Es zeigt 5 Euro.
- 2Nachstellen: Du gibst wieder 3 und 2 ein und siehst wieder 5. Der Fehler lässt sich also nachstellen.
- 3Zwischenausgabe nach der ersten Rechnung: Dort steht 6. Bis hierhin ist alles richtig.
- 4Zwischenausgabe vor der Anzeige: Dort steht 5. Zwischen den beiden Ausgaben wird 1 abgezogen.
- 5So hast du die Fehlerstelle eingegrenzt.
Merke: Erst den Fehler nachstellen, dann eingrenzen: mit Zwischenausgaben, Haltepunkten oder Zeile für Zeile.
Teste dich
Ein Testfall beschreibt einen elementaren Test. Zu seiner Beschreibung gehören zum Beispiel die Eingabedaten und die erwarteten Ergebnisse. Außerdem gehören Vorbedingungen dazu, die vor dem Test hergestellt werden müssen. Weichen die Ausgaben von den erwarteten Werten ab, liegt eine Anomalie vor. Das kann ein Fehler sein, der behoben werden muss. Danach folgt in der Regel eine Testwiederholung.
Warum wiederholt man Tests nach einer Änderung? Wenn du einen Fehler behebst, können andere Funktionen plötzlich nicht mehr funktionieren. Es ist etwa möglich, dass einige Programmteile nur deshalb richtig funktionieren, weil der Fehler vorhanden ist. Ein Regressionsbug (Regression heißt „Rückschritt“) ist ein Fehler, der erst in einer späteren Programmversion auftaucht. Das sind häufig unerkannte Nebeneffekte von Fehlerbehebungen oder Änderungen an anderer Stelle. Solche Test-Wiederholungen nennt man auch Regressionstest.
Warum können Tests nicht beweisen, dass ein Programm fehlerfrei ist? Ein Test stellt nur fest, dass bestimmte Testfälle erfolgreich waren. Um Fehlerfreiheit zu belegen, müssten alle Funktionen und alle möglichen Eingabewerte in allen Kombinationen getestet werden. Das ist, außer bei sehr einfachen Testobjekten, praktisch nicht möglich. Tests sind immer nur Stichproben. Selbst teure oder vielfach getestete Software enthält Programmierfehler.
Definition
Testfall
Ein Testfall ist ein elementarer Test. Er nennt unter anderem die Eingabedaten und das erwartete Ergebnis, das du mit dem Ist-Ergebnis vergleichst.
Merke: Nach einer Änderung führt man die Tests erneut aus. Bestandene Tests zeigen nur, dass diese Testfälle erfolgreich waren, nicht dass keine Fehler mehr vorhanden sind.
Teste dich
Alles auf einen Blick
Debugging
Testen
Man vergleicht Ist- und Soll-Ergebnis und entscheidet: ok oder Fehler.
Debuggen
Man diagnostiziert Fehler und behebt sie.
Fehlerarten
Syntaxfehler brechen die Regeln der Sprache, Laufzeitfehler treten beim Ablauf auf, Logikfehler liefern bei vollständigem Lauf ein falsches Ergebnis.
Vorgehen
Erst den Fehler nachstellen, dann mit Zwischenausgaben, Haltepunkten oder Zeile für Zeile eingrenzen.
Testfall
Eingabedaten und erwartetes Ergebnis.
Grenze
Tests sind Stichproben und beweisen keine Fehlerfreiheit. Nach Änderungen wiederholt man sie.
Musteraufgabe · Schritt für Schritt
Ausgedachtes Beispiel: Alter in fünf Jahren
- 1Aufgabe (ausgedacht): Ein Programm soll zum Alter 5 addieren und das Alter in fünf Jahren ausgeben.
- 2Testfall: Eingabe 12, erwartetes Ergebnis 17.
- 3Test ausführen: Das Programm gibt 7 aus. Ist-Ergebnis 7 und Soll-Ergebnis 17 sind verschieden, also gibt es einen Fehler.
- 4Nachstellen: Auch beim zweiten Versuch gibt Eingabe 12 den Wert 7 aus.
- 5Eingrenzen: Eine Zwischenausgabe vor der Rechnung zeigt 12. Die Eingabe stimmt, der Fehler liegt in der Rechnung.
- 6Ursache: Dort steht alter − 5 statt alter + 5. Das ist ein Logikfehler (minus statt plus).
- 7Beheben: Du änderst die Zeile auf alter + 5.
- 8Tests wiederholen: Eingabe 12 gibt 17. Der alte Testfall Eingabe 0 mit erwartetem Ergebnis 5 gibt ebenfalls 5. Beide sind ok.
- 9Das heißt nur: Diese zwei Testfälle waren erfolgreich. Fehlerfreiheit ist damit nicht bewiesen.
Fehler finden
Prüfe die Aussagen zu Tests und Fehlersuche In einer Zeile steckt ein Fehler. Tippe sie an.
Fehler in Zeile 4Falsche Folgerung aus bestandenen Tests. Richtig: Bestandene Tests zeigen nur, dass diese Testfälle erfolgreich waren. Fehlerfreiheit beweisen sie nicht.
Lückentext
Wähl in jeder Lücke das passende Wort und prüf dann deine Antworten.
Fehlt in einem Programm eine Klammer, ist das ein . Mit einem hält der Debugger das Programm an einer gewählten Stelle an. Nach einer Änderung führt man die Tests aus, denn die Änderung kann andere Funktionen stören.
Karteikasten
Erst selbst überlegen, dann umdrehen.
Übung mit Feedback