35 Debugging: Fehlersuche und
-behebung in der Webentwicklung
Debugging ist der systematische Prozess zur Identifikation und
Behebung von Fehlern in Software. In der Webentwicklung ist Debugging
besonders herausfordernd, da Code in verschiedenen Umgebungen (Browser,
Server) und Sprachen (HTML, CSS, JavaScript, Backend-Sprachen)
ausgeführt wird.
Ein effektiver Debugging-Prozess umfasst:
Fehlererkennung: Identifizieren, dass ein Problem
existiert
Fehlerreproduktion: Verlässliches Wiederholen des
Fehlers
Fehleranalyse: Lokalisieren der Fehlerursache im
Code
Fehlerbehebung: Korrigieren des Codes
Verifikation: Sicherstellen, dass der Fehler
behoben ist und keine neuen entstanden sind
35.1 Arten von Fehlern
In der Webentwicklung treten drei Hauptkategorien von Fehlern
auf:
35.1.1 Syntaxfehler
Verstoß gegen die Sprachregeln (z.B. fehlende Klammern,
Semikolons)
Werden meist schon bei der Kompilierung/Interpretation erkannt
Überwachung von Variablen, Call Stack und Ausdrücken
35.3.2 Statische Codeanalyse
Erkennung potentieller Fehler vor der Ausführung
Einhaltung von Coding-Standards (Linting)
Typenprüfung (z.B. durch TypeScript oder JSDoc)
35.3.3 Integrierte Terminals
Ausführung von Skripten und Befehlen
Anzeige von Ausgaben und Fehlermeldungen
35.3.4 Source Control
Integration
Vergleich von Codeversionen
Nachverfolgung von Änderungen
35.4 Integration zwischen Browser
und IDE
Die Zusammenarbeit zwischen Browser und IDE ermöglicht einen
nahtlosen Debugging-Workflow:
35.4.1 Browser-Debugging aus der
IDE
Moderne IDEs können eine direkte Verbindung zu Browsern
herstellen:
Launch Configurations: Die IDE startet den Browser
mit speziellen Debug-Parametern
Debugging Protocol: Kommunikation über das Chrome
DevTools Protocol (CDP)
Breakpoints-Synchronisation: Breakpoints werden
zwischen IDE und Browser synchronisiert
Gemeinsamer Zustand: Variablenwerte und Call Stack
sind in beiden Umgebungen sichtbar
35.4.2 Workflow-Beispiel (VS Code
mit Chrome)
Konfiguration der launch.json in VS Code:
{"version":"0.2.0","configurations":[{"type":"chrome","request":"launch","name":"Launch Chrome against localhost","url":"http://localhost:8080","webRoot":"${workspaceFolder}"}]}
Start des Debugging-Prozesses in VS Code
Chrome öffnet sich automatisch und verbindet sich mit VS
Code
Breakpoints können in VS Code gesetzt werden und werden im
Browser aktiv
Variablen können in VS Code inspiziert werden, während der Code
im Browser pausiert
35.4.3
Browser-Extension-Debugging
Für komplexere Szenarien wie Browser-Extensions:
Laden der Extension im Developer Mode
Zugriff auf Background-Scripts, Content-Scripts und
Popup-Fenster
Verbindung mit der IDE für erweiterte Debugging-Funktionen
35.5 Debugging-Techniken
35.5.1 Grundlegende Techniken
35.5.1.1 Console-Debugging
Einfügen von console.log() an strategischen
Stellen
Ausgabe von Variablenwerten und Zuständen
Vorteil: Einfach zu implementieren
Nachteil: Muss manuell hinzugefügt und entfernt werden
functioncalculateTotal(items) {console.log('Items received:', items);let total =0;for (const item of items) {console.log('Processing item:', item); total += item.price* item.quantity;console.log('Running total:', total); }return total;}
35.5.1.2 Breakpoint-Debugging
Setzen von Haltepunkten im Code
Schrittweise Ausführung und Inspektion des Zustands
Vorteil: Präzise Kontrolle über die Ausführung
Nachteil: Kann bei komplexen Anwendungen zeitaufwändig sein
35.5.1.3 Logpoints
Alternative zu console.log(), die keine Codeänderungen
erfordert
In der IDE oder im Browser-Debugger hinzufügbar
Ausgabe von Werten bei Erreichen bestimmter Codezeilen
35.5.2 Fortgeschrittene
Techniken
35.5.2.1 Conditional
Breakpoints
Breakpoints, die nur unter bestimmten Bedingungen aktiviert
werden
Nützlich für Probleme, die nur in speziellen Situationen
auftreten
Beispiel: Pausieren, wenn ein Wert einen bestimmten Schwellenwert
überschreitet
35.5.2.2 DOM-Breakpoints
Pausieren der Ausführung, wenn bestimmte DOM-Änderungen
auftreten
Arten:
Subtree Modifications: Änderungen in der Knoten-Hierarchie
Attribute Modifications: Änderungen an Attributen
Node Removal: Entfernen von Knoten
35.5.2.3 XHR/Fetch-Breakpoints
Pausieren bei bestimmten Netzwerkanfragen
Nützlich für die Analyse von API-Interaktionen
35.5.2.4 Exception-Breakpoints
Automatisches Pausieren bei bestimmten Fehlertypen
Hilft, den genauen Ort einer Exception zu lokalisieren