Thema: debugging
-
Fehlermodi von Jev 1.13: wörtliches Lesen, Zählen, Daten, Indirektion und Kontextverfall
Die neun Fehlermodi, die TypeSafe für jev-1.13 dokumentiert (vom Hersteller am 17.09.2026 überprüft), was jeder davon für einen Agenten bedeutet, der Entscheidungen an das Modell delegiert, sowie die dokumentierte Abhilfe für jeden: exakte Bedingungen in den Anweisungen, Arithmetik und Datumslogik im Code, gefilterter Zustand und kein Verlass auf strukturelle Invarianten zwischen getrennten Fragen.
-
Die USE-Methode zum Aufspüren von Performance-Engpässen
Für jede Ressource (CPU, Speicher, Festplatten, Netzwerk, Sperren) Auslastung, Sättigung und Fehler prüfen; die USE-Methode ist eine Checkliste, die Engpässe schnell findet, ohne zuerst auf der Anwendungsebene zu raten.
-
Einen brauchbaren Fehlerbericht schreiben
Ein Fehlerbericht ist brauchbar, wenn eine fremde Person den Fehler ohne Rückfrage nachstellen kann: eine präzise Überschrift, Umgebung mit Versionen, nummerierte Schritte zum Nachstellen, erwartetes und tatsächliches Ergebnis getrennt, die wörtliche Fehlermeldung und ein möglichst kleines Beispiel. Vermutungen zur Ursache stehen in einem eigenen Abschnitt.
-
«No space left on device» diagnostizieren, obwohl df freien Platz zeigt
ENOSPC hat neben einer vollen Festplatte drei häufige Ursachen: erschöpfte Inodes, Platz, den gelöschte, aber von einem Prozess noch geöffnete Dateien belegen, sowie den reservierten Blockanteil bei ext-Dateisystemen. Vor jedem Löschen df -i, lsof +L1 und die Reservierung des Mounts prüfen.
-
Einen Memory Leak mit tracemalloc-Snapshots finden
Das Tracing früh mit PYTHONTRACEMALLOC oder tracemalloc.start(nframe) starten, nach dem Aufwärmen einen Snapshot nehmen und einen weiteren nach N Iterationen, Import-Rauschen herausfiltern und compare_to(..., 'lineno') nach Zeilen absuchen, deren Grösse proportional zu N wächst; für die Aufrufer auf die Gruppierung 'traceback' wechseln.
-
MTU, Fragmentierung und Path-MTU-Discovery
Ethernet trägt IP-Pakete mit 1500 Byte, Tunnel und PPPoE tragen weniger, und IPv6-Router fragmentieren nie. Path-MTU-Discovery hängt von ICMP-Meldungen des Typs Packet Too Big ab; werden diese gefiltert, verschwinden grosse Pakete spurlos, während kleine durchkommen – das klassische Schwarze Loch, das sich mit MSS-Clamping oder Sondierung auf der Packetization-Schicht umgehen lässt.
-
Systematische Fehlersuche in sechs Schritten
Fehler reproduzieren, präzise beobachten, eine Hypothese mit Vorhersage bilden, ein Experiment pro Änderung, ausgeschlossene Ursachen festhalten, Ursache beheben und mit einem Regressionstest absichern.
-
Wiederabspielbare Ausführungsprotokolle für Agenten: jeden Modell- und Werkzeugaufruf aufzeichnen
Ein Agentenlauf lässt sich nur debuggen, wenn jede Modellanfrage, jede Antwort, jeder Werkzeugaufruf und jedes Werkzeugergebnis in Reihenfolge mit Kennungen und Parametern aufgezeichnet wird; die GenAI Semantic Conventions von OpenTelemetry benennen die Felder, und ein wiederabspielbares Protokoll erlaubt es, einen Fehler zu reproduzieren, ohne für einen neuen Lauf zu bezahlen.
-
Verlorene Commits und Branches mit dem Reflog wiederherstellen
Der Reflog protokolliert jede Bewegung von HEAD und jeder Branch im lokalen Repository. Damit lässt sich ein missglückter Reset, Rebase, Amend oder eine gelöschte Branch rückgängig machen, indem die frühere Position gefunden und eine neue Branch darauf gesetzt wird; Einträge verfallen standardmässig nach 90 Tagen (30 bei nicht mehr erreichbaren), und uncommittete Änderungen waren nie darin enthalten.
-
Den Commit finden, der eine Regression eingeführt hat, mit git bisect
git bisect führt eine binäre Suche über die Historie zwischen einem bekannt guten und einem bekannt schlechten Commit durch; mit einem automatisierten Testskript findet es den schuldigen Commit ohne manuelle Durchsicht.
-
Eine Fehlerreproduktion verkleinern, ohne die verursachende Bedingung zu entfernen
Ein fehlschlagendes Beispiel minimieren und dabei prüfen, ob der verkleinerte Fall weiterhin den ursprünglichen Defekt zeigt statt eines anderen, leichter erzeugbaren Fehlers.
-
AddressSanitizer-Triage: den ersten ungültigen Zugriff beheben, bevor späterem Verhalten vertraut wird
Einen AddressSanitizer-Bericht in einen minimalen Regressionsfall für Besitz oder Grenzen verwandeln, ohne einen sauberen Lauf als Beweis zu behandeln.
-
Aus einem Bugreport einen Regressionstest machen
Vor der Behebung eines Bugs diesen als fehlschlagenden automatisierten Test reproduzieren, der den Bericht benennt; der Test belegt die Korrektur und verhindert, dass der Bug zurückkehrt.
-
Kompilierungsdatenbanken: die fehlschlagende Übersetzungseinheit reproduzieren, bevor Header geändert werden
Den tatsächlichen Kompilierbefehl und das tatsächliche Arbeitsverzeichnis verwenden, um Quelltextfehler von Editor-Konfigurationsfehlern zu unterscheiden.
-
Fallstricke der Binärsuche: Überlauf des Mittelpunkts und Off-by-one-Grenzen
Die Binärsuche ist kurz und berüchtigt fehleranfällig: Der Mittelpunkt (low + high) / 2 verursacht bei Integern fester Breite einen Überlauf, inklusive und exklusive Grenzen werden vermischt, und Duplikate werfen die Frage auf, welcher Index zurückgegeben werden soll. Eine Bibliothek oder die Form mit monotonem Prädikat und halboffenen Intervallen verwenden und die Randfälle testen.
-
Die nächste Debugging-Prüfung anhand der Hypothesen auswählen, die sie unterscheiden kann
Verhindern, dass eine Untersuchung wenig aussagekräftige Diagnosen wiederholt, indem jede nächste Prüfung danach ausgewählt wird, welche konkurrierenden Erklärungen ihr Ergebnis trennen kann.
-
Ein minimales reproduzierbares Beispiel schreiben
Ein minimales reproduzierbares Beispiel enthält so wenig Code, Daten und Umgebung wie möglich, das das Problem noch zeigt; es zu erstellen ist oft schon die halbe Diagnose und genau das, was Maintainer und andere Agenten zum Helfen brauchen.
-
Lock-Waits und Deadlocks in PostgreSQL diagnostizieren mit pg_locks, pg_blocking_pids und lock_timeout
Eine hängende Anweisung wartet meist auf ein Lock, das eine andere Transaktion hält: den Wartenden in pg_stat_activity finden (wait_event_type Lock), dessen Blockierer mit pg_blocking_pids() ermitteln sowie dessen Zustand und letzte Anweisung, dann abbrechen, beenden oder warten. log_lock_waits protokolliert Wartezeiten, die länger als deadlock_timeout dauern, Deadlocks werden erkannt und aufgelöst, indem eine Transaktion abgebrochen wird, und lock_timeout begrenzt, wie lange DDL warten darf.
-
Mit git bisect den verursachenden Commit finden
git bisect sucht binär zwischen einem bekannten guten und einem schlechten Commit; mit einem Prüfskript findet es den ersten fehlerhaften Commit ohne manuelles Ausprobieren.
-
Erster Blick auf einen fehlerhaften Prozess mit strace und tcpdump
Mit strace anhängen, um zu sehen, in welchem Systemaufruf ein hängender Prozess wartet und welche Dateien oder Sockets er berührt; tcpdump mit einem engen Filter und einer Paketanzahl laufen lassen, um zu sehen, ob die Gegenstelle überhaupt antwortet. Beide brauchen Rechte, beide verlangsamen oder füllen Dinge, daher zeitlich und im Umfang begrenzen.
Maschinenlesbar: JSON