# Systematisches Debug-Framework ## Trigger Dieses Skill aktivieren bei: - Fehlermeldungen / Exceptions - Unerwartetes Verhalten - Performance-Probleme - "Es funktioniert nicht" --- ## Phase 1: Reproduzieren (5 min max) ### Ziel: Bug in einen Test verwandeln ```bash # 1. Exakte Schritte dokumentieren # 2. Fehlermeldung/Symptom notieren # 3. Umgebung identifizieren ``` **Fragen:** - [ ] Ist der Bug reproduzierbar? - [ ] Tritt er nur in bestimmten Umgebungen auf? - [ ] Seit wann tritt er auf? (letzter Deploy?) ### Breakpilot-spezifisch: Welcher Service? ```bash # Container-Status prüfen ssh macmini "docker compose ps | grep -E '(Exit|unhealthy)'" # Logs der letzten 5 Minuten ssh macmini "docker compose logs --since 5m " ``` | Symptom | Wahrscheinlicher Service | |---------|-------------------------| | Login fehlgeschlagen | consent-service, backend | | 502 Bad Gateway | nginx, upstream-service | | Langsame Suche | qdrant, embedding-service | | Upload-Fehler | minio, backend | | OCR-Fehler | paddleocr-service, klausur-service | --- ## Phase 2: Hypothesen bilden (5 min max) ### 3-5 mögliche Ursachen auflisten | # | Hypothese | Wahrscheinlichkeit | Test | |---|-----------|-------------------|------| | 1 | | Hoch/Mittel/Niedrig | | | 2 | | | | | 3 | | | | ### Häufige Ursachen bei Breakpilot **Container/Docker:** - Container nicht gestartet - Volume-Mount-Problem - Netzwerk zwischen Containern unterbrochen - Resource-Limits erreicht **Datenbank:** - Connection Pool erschöpft - Migration nicht ausgeführt - Deadlock **API/Backend:** - JWT abgelaufen - CORS-Fehler - Rate-Limit erreicht - Falscher Content-Type **Frontend:** - Cache-Problem (Safari!) - Build nicht aktualisiert - Umgebungsvariable fehlt --- ## Phase 3: Systematisch eliminieren (10 min max) ### Reihenfolge: Schnellste Tests zuerst ```bash # 1. Ist der Service überhaupt erreichbar? curl -s https://macmini:8000/health | jq # 2. Container-Logs auf Fehler prüfen ssh macmini "docker compose logs --tail 50 2>&1 | grep -iE '(error|exception|failed|traceback)'" # 3. Datenbank-Verbindung testen ssh macmini "docker exec breakpilot-pwa-postgres pg_isready" # 4. Redis/Valkey erreichbar? ssh macmini "docker exec breakpilot-pwa-valkey valkey-cli ping" ``` ### Hypothese testen Für jede Hypothese: 1. **Test definieren** (wie prüfen wir das?) 2. **Test ausführen** 3. **Ergebnis:** Bestätigt ✅ / Widerlegt ❌ --- ## Phase 4: Root Cause identifizieren ### Nicht das Symptom behandeln! **Schlecht:** "Ich starte den Container neu" **Gut:** "Der Container crashed wegen OOM → Memory-Limit erhöhen" ### 5-Why-Methode ``` Problem: API gibt 500 zurück ↓ Warum? Datenbank-Query failed ↓ Warum? Connection Pool erschöpft ↓ Warum? Connections werden nicht freigegeben ↓ Warum? Exception vor connection.close() ↓ Warum? Fehlendes try/finally → ROOT CAUSE: Fehlendes Resource-Cleanup ``` --- ## Phase 5: Fix implementieren ### Checkliste vor dem Fix - [ ] Root Cause verstanden (nicht nur Symptom) - [ ] Fix adressiert Root Cause - [ ] Keine Seiteneffekte erwartet - [ ] Test geschrieben, der Regression verhindert ### Fix-Template ```python # VORHER: Bug def fetch_data(): conn = get_connection() result = conn.query(...) # Exception hier → Leak! conn.close() return result # NACHHER: Fix mit Erklärung def fetch_data(): """Fetch data with proper connection handling. Fixed: Connection leak when query raises exception. See: https://macmini:3003/.../issues/123 """ conn = get_connection() try: result = conn.query(...) return result finally: conn.close() # Immer ausgeführt ``` --- ## Phase 6: Regression verhindern ### Test schreiben ```python def test_connection_released_on_error(): """Regression test for connection leak bug. Issue: #123 Root cause: Missing finally block in fetch_data() """ initial_connections = get_pool_size() with pytest.raises(DatabaseError): fetch_data_with_bad_query() # Connection should be returned to pool assert get_pool_size() == initial_connections ``` ### Dokumentieren ```bash # Was haben wir gelernt? # → docs-src/development/debugging-notes.md ergänzen ``` --- ## Quick Reference: Breakpilot Debug Commands ```bash # Alle Container-Status ssh macmini "docker compose ps" # Logs eines Services (live) ssh macmini "docker compose logs -f " # In Container einloggen ssh macmini "docker exec -it breakpilot-pwa- sh" # PostgreSQL Query ssh macmini "docker exec breakpilot-pwa-postgres psql -U breakpilot -d breakpilot_db -c 'SELECT 1'" # Netzwerk-Debug ssh macmini "docker exec breakpilot-pwa-backend curl -s http://consent-service:8081/health" # Resource-Nutzung ssh macmini "docker stats --no-stream" # Vault-Status ssh macmini "docker exec breakpilot-pwa-vault vault status" ``` --- ## Anti-Patterns vermeiden | ❌ Nicht machen | ✅ Stattdessen | |-----------------|----------------| | Random Code ändern | Hypothese bilden, dann testen | | console.log überall | Gezielt an verdächtigen Stellen | | Container neustarten und hoffen | Root Cause finden | | Stundenlang alleine debuggen | Nach 30 min Hilfe holen | | Fix ohne Test | Immer Regression-Test schreiben |