Lässt es sich mit cremefarbenem Papier, einer Tönung, mehr Kontrast oder größerer Schrift besser lesen? Wählen Sie Ihre Farben und Ihre Schrift, einmalig für alle Seiten.

Kostenlose Lektion

Fehlersuche: immer nur eine Sache prüfen

Nach dieser Lektion: Ich kann einen Fehler finden, indem ich die Fehlermeldung lese und immer nur eine Sache prüfe.

Lektion, 60 Min.13 BefehleLab „Linux im Alltag“: die dreißig Befehle, die Entwickelnde auswendig tippen

Wie man ein falsches Programm debuggt

Debuggen heißt herauszufinden, warum ein Programm das Falsche tut, und es dann zu ändern. Die meiste Arbeit ist nicht das Tippen der Korrektur. Sie besteht darin zu wissen, welche von hundert Stellen man ansehen muss.

Raten und wahlloses Ändern kann einen Nachmittag kosten. Immer nur eine Sache zu prüfen dauert Minuten. Diese Lektion zeigt, wie.

Am Ende dieser Lektion

Notiz

Ich kann einen Fehler finden, indem ich die Fehlermeldung lese und immer nur eine Sache prüfe.

Schlüsselwörter

BegriffWas er bedeutet
Bugein Fehler im Programm, der falsches Verhalten auslöst
Reproduzierenden Fehler gezielt und gleich noch einmal auslösen
Tracebackdie Liste der Aufrufe, die Python bei einem Fehlerabbruch ausgibt
Hypotheseeine Vermutung zur Ursache, die eine Prüfung widerlegen kann
Print-Kontrolleeine Zeile, die einen Wert anzeigt, um zu sehen, was das Programm wirklich hält
Halbierendie Mitte des Rests prüfen, sodass jede Prüfung die Hälfte ausschließt

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Zuerst den Fehler auf Abruf auslösen

Was Sie nicht sehen können, können Sie nicht beheben. Suchen Sie, bevor Sie etwas ändern, eine Eingabe, die den Fehler jedes Mal auslöst, und behalten Sie sie.

Hier mittelt ein kleines Programm die Umsätze einer Datei, eine Zeile pro Tag. In den Daten fehlt ein Wert. Legen Sie zuerst Ordner und Datei an.

Ordner für die Lektion anlegen

Befehl
mkdir -p ~/fehlersuche

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

In den Ordner wechseln

Befehl
cd ~/fehlersuche

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Die Umsatzdatei schreiben

Befehl
printf 'mo 120\ndi 80\nmi fehlt\ndo 200\n' > umsaetze.txt

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Das Berichtsprogramm schreiben

Befehl
printf 'def zerlege(zeile):\n    tag, betrag = zeile.split()\n    return tag, int(betrag)\n\n\ndef mittelwert(zeilen):\n    summe = 0\n    for zeile in zeilen:\n        tag, betrag = zerlege(zeile)\n        summe = summe + betrag\n    return summe / len(zeilen)\n\n\nprint(mittelwert(open("umsaetze.txt").read().splitlines()))\n' > bericht.py

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Starten und den Abbruch ansehen

Befehl
python3 bericht.py

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Einen Traceback von unten nach oben lesen

Ein Traceback listet die Aufrufe auf, die beim Abbruch offen waren. Der neueste Aufruf steht unten, also lesen Sie von unten.

Die letzte Zeile sagt, was schiefging: ValueError mit einer Meldung. Die File-Zeile darüber sagt, wo: eine Datei, eine Zeilennummer und eine Funktion. Die Zeilen darüber zeigen, wie das Programm dorthin kam.

Nur die File-Zeilen anzeigen

Befehl
python3 bericht.py 2>&1 | grep "File"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Eine Sache prüfen, dann die nächste

Der Fehler zeigt, wo das Programm stehen blieb, nicht warum die Daten falsch waren. Bilden Sie also eine Hypothese: eine Vermutung, die eine Prüfung widerlegen kann.

Hier lautet sie: Eine Zeile der Daten ist keine Zahl. Suchen Sie in der Datei danach. Findet die Prüfung nichts, war die Vermutung falsch, und auch das ist Fortschritt.

Die Daten nach dem Text durchsuchen

Befehl
grep -n "fehlt" umsaetze.txt

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Eine schnelle Korrektur kann den nächsten Fehler verbergen

Zeile 3 lautet mi fehlt: An dem Tag gab es keinen Umsatzwert. Am schnellsten zählen Sie ihn als 0. Probieren Sie es aus und starten Sie das Programm erneut.

Einen fehlenden Wert als 0 zählen

Befehl
sed -i 's|    return tag, int(betrag)|    if betrag == "fehlt":\n        return tag, 0\n    return tag, int(betrag)|' bericht.py

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Erneut starten

Befehl
python3 bericht.py

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Kein Fehler heißt nicht fehlerfrei

Das Programm lief und gab 100.0 aus. Der Mittelwert der drei Tage mit Werten, 120, 80 und 200, ist aber 133,3. Das Programm ist falsch und sagt nichts.

Jetzt gibt es keinen Traceback zu lesen. Setzen Sie eine Print-Kontrolle dorthin, wo addiert wird, und sehen Sie, was wirklich vorliegt.

Jeden Tag beim Addieren ausgeben

Befehl
sed -i 's|        summe = summe + betrag|        print(tag, betrag)\n        summe = summe + betrag|' bericht.py

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Starten und jede Zeile lesen

Befehl
python3 bericht.py

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Bei vielen Stufen das Problem halbieren

Das Programm hat vier Stufen. Prüfen Sie zuerst die mittlere. Stimmt die Summe, liegt der Fehler dahinter. Stimmt sie nicht, liegt er davor. Jede Prüfung schließt die Hälfte aus.

So findet ein Team, welche von tausend Änderungen eine Funktion kaputt gemacht hat.

Beispiel: die Stufen prüfen

StufeSollIstUrteil
Datei lesen4 Zeilen4 ZeilenIn Ordnung
Jeden Betrag lesen120, 80, fehlt, 200120, 80, 0, 200Die 0 ist eine erfundene Zahl
Addieren400400In Ordnung
Durch die gezählten Tage teilen400 / 3 = 133,3400 / 4 = 100.0Ein Tag ohne Wert wurde mitgezählt

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Das Programm mit der Korrektur neu schreiben

Befehl
printf 'def zerlege(zeile):\n    tag, betrag = zeile.split()\n    if not betrag.isdigit():\n        return None\n    return tag, int(betrag)\n\n\ndef mittelwert(zeilen):\n    summe = 0\n    anzahl = 0\n    for zeile in zeilen:\n        paar = zerlege(zeile)\n        if paar is not None:\n            summe = summe + paar[1]\n            anzahl = anzahl + 1\n    return summe / anzahl\n\n\nprint(round(mittelwert(open("umsaetze.txt").read().splitlines()), 1))\n' > bericht.py

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Das korrigierte Programm starten

Befehl
python3 bericht.py

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Ein häufiger Fehler

Warnung

Viele ändern Code, bevor sie die Ursache kennen, und ändern etwas anderes, wenn das nicht hilft. Nach fünf Änderungen weiß niemand, welche geholfen hat. Prüfen Sie zuerst, ändern Sie eine Sache und starten Sie erneut.

Weiterdenken: die Änderung finden, die es kaputt machte

Ein Team hält jede Änderung in Git fest. Tritt ein Fehler auf, ist eine alte Version gut und die neueste schlecht. Der Befehl git bisect lässt Sie die mittlere Version testen und halbiert den Verlauf, bis eine Änderung übrig bleibt.

Schreiben Sie die Schritte für 1000 Änderungen auf. Wie viele Versionen testen Sie höchstens?

Über dieses Lab und seinen Quellcode: Lab „Linux im Alltag“: die dreißig Befehle, die Entwickelnde auswendig tippen

Sie unterrichten eine Gruppe? Weisen Sie dieses Modul Ihren Studierenden zu, mit Handbuch für Lehrende, automatisch geprüften Aufgaben und einem Lab für jede Person.