Einheit 5 / 12

Debuggen und Fehlerbehebung

Gewinne:

  • Fähigkeit, der KI einen Fehler effektiv mit Fehlermeldung, Stack-Trace und kleinster Reproduktionsinstanz zu beschreiben
  • Möglichkeit, einen systematischen Debugging-Ablauf mit KI durchzuführen, um die Grundursache zu finden, indem Hypothesen aufgestellt und Schritt für Schritt eingegrenzt werden
  • Möglichkeit, durch Reproduktion und Regressionstests zu überprüfen, ob die von der KI vorgeschlagene Lösung das Problem tatsächlich behoben hat

Beim Debuggen geht es darum, herauszufinden, warum sich ein Programm anders als erwartet verhält, und das Problem zu beheben. Dies nimmt für die meisten Ingenieure viel Zeit in Anspruch. Gutes Debugging basiert nicht auf einem Ratespiel, sondern auf einer systematischen Eingrenzung: Symptom klären, Hypothese aufstellen, Hypothese testen, der Ursache auf den Grund gehen. KI ist in diesem Zyklus ein sehr mächtiger Partner; Aber nur, wenn Sie ihm die richtigen Informationen geben. Die Aussage „Code funktioniert nicht, reparieren Sie ihn“ zwingt die KI dazu, zu raten und pauschale Vorschläge zu machen. Geben Sie die vollständige Fehlermeldung, den Stack-Trace und das kleinste Reproduktionsbeispiel ein, und gemeinsam finden Sie die Grundursache.

In dieser Einheit erfahren Sie, wie Sie der KI einen Fehler effektiv beschreiben, Hypothesen Schritt für Schritt eingrenzen und durch Regressionstests überprüfen, ob die vorgeschlagene Lösung das Problem tatsächlich löst. Denken Sie daran: „Einen Fehler zu beheben“ und „das Symptom des Fehlers zu unterdrücken“ sind zwei verschiedene Dinge; Eine Korrektur ohne Ermittlung der Grundursache verschiebt den Fehler an eine andere Stelle.

Konzepte: Stack-Trace: Ein Dump, der zeigt, welche Funktionen zum Zeitpunkt des Fehlers in welcher Reihenfolge aufgerufen wurden. Minimale Reproduktion: Der einfachste und kürzeste Code/die einfachste Eingabe, die den Fehler auslöst. Grundursache: Die eigentliche Ursache des Problems, nicht das Symptom. Regressionstests: Tests, die sicherstellen, dass sich derselbe Fehler nicht wiederholt.

Der KI einen Fehler beschreiben

Die Wahrscheinlichkeit, dass KI die Grundursache findet, ist direkt proportional zur Qualität der von Ihnen bereitgestellten Informationen. Zu einer guten Fehlerbeschreibung gehören: was Sie versucht haben, was Sie erwartet haben, was passiert ist, der genaue Fehlertext und die Stapelüberwachung, der beteiligte Code, die Umgebung (Sprache/Version/Betriebssystem) und das kleinste Beispiel, das den Fehler verursacht hat.

  1. Klären Sie das Symptom. Im Format „Erwartetes X, aktualisiertes Y“.
  2. Fügen Sie den vollständigen Fehlertext und den Stack-Trace ein. Kürzen Sie es nicht, zensieren Sie es nicht, aber zerstören Sie nicht die Struktur.
  3. Geben Sie die kleinste Reproduktion an. Mindesteingabe und Code, der den Fehler auslöst.
  4. Geben Sie die Umgebung an. Sprachversion, Bibliotheksversion, Laufzeitumgebung.

Effektive Fehlerbeschreibungsaufforderung: „Ich debugge einen Fehler. Information: – Was ich versuche: [X] – Erwartetes Verhalten: [Y] – Tatsächliches Verhalten: [Z] – Vollständige Fehlermeldung und Stack-Trace: [Einfügen] – Umgebung: [Sprache/Version, Bibliothek/Version] – Mindestbeteiligter Code: [Code] Geben Sie mir keine direkte Lösung. Listen Sie zunächst die drei wahrscheinlichsten Grundursachen in der Reihenfolge ihrer Wahrscheinlichkeit auf und sagen Sie mir, welche Prüfung ich jeweils überprüfen muss.“

Einengung des Flusses durch Hypothese

Systematisches Debuggen ist die Kunst, Möglichkeiten nacheinander zu eliminieren. Verwenden Sie KI, um Hypothesen zu generieren und das Experiment zu entwerfen, um jede Hypothese zu testen. Führen Sie dann das Experiment aus und geben Sie das Ergebnis zurück. Dieser Zyklus ist viel schneller als die Gewohnheit, zufällige Änderungen vorzunehmen und dann anzuhalten, was als „Shotgun-Debugging“ bezeichnet wird.

Hilfsaufforderung für die binäre Suche (Bisektion): „Dieser Fehler war gestern nicht da, er ist heute da. Ich möchte herausfinden, welche der letzten 20 Änderungen den Fehler mit Bisect verursacht haben. Geben Sie mir einen Schritt-für-Schritt-Plan: Welchen Punkt soll ich testen, zu welcher Hälfte soll ich gehen, abhängig vom Ergebnis. Sagen Sie mir auch genau, was ich bei jedem Schritt überprüfen soll.“

Eingabeaufforderung zur Protokolleinfügungsstrategie: „Ich kann den Fehler nicht finden, da ich die Zwischenwerte in dieser Funktion nicht sehen kann. Sagen Sie mir, an welchen Stellen ich Protokollzeilen hinzufügen muss, die welche Variablen drucken. Fügen Sie für jedes Protokoll eine Erklärung „Was werde ich aus diesem Protokoll lernen“ hinzu. Geben Sie außerdem die Warnungen an, die mich daran hindern, vertrauliche Daten zu protokollieren.“

Tipp: Wenn Sie einen Fehler nicht beheben können, liegt das Problem meist irgendwo, wo Sie fälschlicherweise angenommen haben. Fragen Sie die KI: „Welche meiner Annahmen könnte falsch sein?“ Wenn Sie fragen, wird Ihre Blindheit gebrochen. Die schwerwiegendsten Fehler verbergen sich dort, wo man sagt: „Ich bin sicher, das funktioniert richtig.“

Schwache Eingabeaufforderung / Starke Eingabeaufforderung

SCHWACH: „Mein Code gibt einen Fehler aus, beheben Sie ihn: [200 Zeilen Code]“ (Ergebnis: KI weiß nicht, um welchen Fehler es sich handelt und was erwartet wird; sie gibt allgemeine Vorschläge, die auf Vermutungen basieren, die meisten davon sind nutzlos.)STRONG: „Ich erhalte NullPointerException. Erwartet: Benutzerliste sollte zurückgegeben werden. Tatsächlich: Explodiert beim Aufruf von getUsers(). Stapelverfolgung: [Einfügen]. Umgebung: Java 17. Mindestwiederholung: Dies passiert, wenn die Benutzer Liste ist leer, aber nicht, wenn sie voll ist: [Code] Erklären Sie die Grundursache und warum die leere Liste ausgelöst wird, und schlagen Sie dann eine Lösung vor.

Die leistungsstarke Eingabeaufforderung stellt den Fehler in einen Kontext: In diesem Fall tritt er auf (leere Liste), in diesem Fall tritt er nicht auf (vollständige Liste). Dieser einzelne Hinweis („passiert, wenn leer“) weist fast direkt auf die Grundursache hin. Da diese Informationen in der schwachen Eingabeaufforderung nicht verfügbar sind, führt die KI eine Blindvermutung durch.

Überprüfung des Fixes

Ein Fix ist nur dann ein echter Fix, wenn er drei Dinge bewirkt:

Kontrolle

Frage

So überprüfen Sie

Ist der Fehler weg?

Funktioniert der gleiche Eintrag jetzt?

Führen Sie die minimale Reproduktion erneut aus

Keine neuen Fehler?

Ist sonst noch etwas kaputt?

Führen Sie die gesamte Testsuite aus

Wird es sich nicht wiederholen?

Wird der gleiche Fehler erneut auftreten?

Fügen Sie für dieses Szenario einen Regressionstest hinzu

Korrekturen, die durchgeführt werden, ohne die Grundursache zu finden, unterdrücken oft das Symptom. Wenn Sie beispielsweise einen Nullfehler mit „Überspringen, wenn Null“ beschönigen, wird der eigentliche Grund ermittelt: „Warum werden die Daten als Null angezeigt?“ unsichtbar, und der Fehler tritt an anderer Stelle erneut auf.

Mini-Hüllen

Fall 1 – Die Symptomunterdrückungsfalle. Ein Team unterbindet einen gelegentlichen Nullfehler mit einem Try-Catch; Der Fehler verschwindet, aber nach 2 Wochen scheinen die Daten zu fehlen. Der wahre Grund ist, dass ein Dienst bei Zeitüberschreitung null zurückgibt. Wenn Sie die KI fragen: „Warum wird sie null?“, kommt die Grundursache zum Vorschein. Die eigentliche Reparatur dauert 1 Stunde, ist aber dauerhaft.

Fall 2 – Minimale Reproduktionsleistung. Ein Entwickler kann einen Fehler nicht beheben, der besagt: „Es stürzt ab und zu ab.“ Mit dem Vorschlag von AI wird der Fehler auf die kleinste Eingabe reduziert: Das Problem tritt nur bei Dateinamen auf, die türkische Zeichen enthalten (Kodierungsfehler). Wenn 300 Zeilen Unsicherheit auf 5 Zeilen definitiver Reproduktion reduziert werden, wird die Lösung offensichtlich.

Fall 3 – Anti-Regressionstest. KI behebt einen Datumsberechnungsfehler. Damit ist der Ingenieur nicht zufrieden; fügt einen Regressionstest für das fehlerhafte Szenario (Monatsende, 31. Januar + 1 Monat) hinzu. Wenn 4 Monate später eine weitere Änderung denselben Bereich betrifft, wird der Test rot und der Fehler wird erkannt, bevor er in Produktion geht.

Häufige Fehler

  • Es bedeutet „Es funktioniert nicht, reparieren Sie es“. Ohne Fehlertext, Erwartung und Reproduktion, KI-Vermutungen.
  • Der Stack-Trace wird nicht angezeigt. Der Stacktrace gibt oft direkt Aufschluss über die Grundursache.
  • Nehmen Sie weiterhin zufällige Änderungen vor. Experimente ohne Aufstellung einer Hypothese verschwenden Zeit.
  • Das Symptom unterdrücken und die Grundursache übersehen. Der Fehler wird an anderer Stelle wiedergeboren.
  • Der Fix kann nicht durch Regressionstests gesichert werden. Derselbe Fehler tritt in Zukunft stillschweigend wieder auf.

Zusammenfassend

Effektives Debuggen bedeutet systematisches Einschränken, nicht Raten. Wenn der KI der vollständige Fehlertext, die Stapelverfolgung, die minimale Reproduktion und Umgebungsinformationen zur Verfügung gestellt werden, erhöht sich die Wahrscheinlichkeit, die Grundursache zu finden, exponentiell. Verwenden Sie KI, um Hypothesen zu generieren und das Experiment zu entwerfen, um jede Hypothese zu testen. Sie führen das Experiment durch. Betrachten Sie einen Fix nur dann als „erledigt“, wenn Sie feststellen, dass der Fehler behoben ist, keine neuen Fehler eingeführt wurden und der Fehler durch Regressionstests geschützt ist.

Anwendungsaufgabe

Betrachten Sie einen echten oder künstlichen Fehler. Reduzieren Sie zunächst den Fehler auf die kleinste Reproduktion (in welcher Eingabe er auftritt, in welcher nicht). Bitten Sie die KI mithilfe der effektiven Eingabeaufforderung für Fehlerrezepte um drei Grundursachenhypothesen und einen Verifizierungsschritt für jede. Finden Sie die Grundursache, indem Sie die Hypothesen einzeln testen, beheben Sie sie und schreiben Sie dann einen Regressionstest für dieses Szenario und führen Sie ihn aus, um zu zeigen, dass der Fehler behoben ist und der Test Schutz bietet.

Checkliste

  • [ ] Ich habe das Symptom als „erwartet vs. realisiert“ geklärt.
  • [ ] Ich habe der KI den vollständigen Fehlertext und den Stack-Trace übergeben.
  • [ ] Ich habe den Fehler auf die kleinste Reproduktion reduziert.
  • [ ] Indem ich die Hypothesen einzeln testete, fand ich die Grundursache.
  • [ ] Anstatt das Symptom zu unterdrücken, habe ich die Grundursache behoben.
  • [ ] Ich habe einen Regressionstest für denselben Fehler hinzugefügt und ausgeführt.