Mein IBM Anmelden Abonnieren

Startseite

Themen

Debugging

Was ist Debuggen?

Was ist Debuggen?

Die Debugging-Lösung von IBM erkunden Für den Think Newsletter anmelden
Illustration mit Collage aus Piktogrammen von Ausrüstung, Roboterarm, Mobiltelefon

Veröffentlicht: 16. September 2024
Mitwirkende: Camilo Quiroz-Vazquez

Was ist Debuggen?

Was ist Debuggen?

Beim Debugging werden Codierungsfehler in Softwareprogrammen gefunden, isoliert und behoben. Das Debugging hilft dabei, die Ursache von Codierungsfehler aufzudecken, Probleme mit der Softwarefunktion zu vermeiden und die Gesamtleistung der Software zu verbessern.

Codierungsfehler wie logische Fehler, Laufzeitfehler, Syntaxfehler und semantische Fehler können zu Abstürzen, falschen oder ungenauen Outputs, Sicherheitslücken und Datenverlust führen. Im Gegensatz zu Softwaretests, bei dem Entwickler die Auswirkungen dieser Fehler im Quellcode eines Programms untersuchen können, zielt das Debugging darauf ab, die Ursache dieser Fehler zu finden und zu beheben.  

Beim Debugging führen Softwareentwickler eine grundlegende Ursachenanalyse durch, um sicherzustellen, dass Fehler in Computerprogrammen behoben werden und nicht erneut auftreten. Bugs können sich negativ auf die Stabilität, Zuverlässigkeit und die User Experience von Software auswirken. Debugging-Tools und -Strategien helfen, den gesamten Prozess zu optimieren.

Problemlösung und Debugging

Erfahren Sie, wie Sie die häufigsten Fehler in Resilient beheben können.

Ähnliche Inhalte Was ist neu beim IBM z/OS Debugger
Der Debugging-Prozess

Der Debugging-Prozess

Die Fehlerbehebung umfasst in der Regel sechs Schritte:

- Reproduzieren der Bedingungen
- Lokalisierung des Bugs
- Ermittlung der Ursache
- Behebung des Bugs
- Test zur Validierung der Fehlerbehebung
- Dokumentation des Prozesses

Schritt 1: Reproduzieren Sie die Bedingungen
 

Der Debugging-Prozess erfordert Genauigkeit. Ingenieure können sich nicht auf eine Beschreibung des Problems aus zweiter Hand verlassen, um es genau zu diagnostizieren. Daher besteht der erste Schritt im Debugging-Prozess darin, die Bedingungen zu reproduzieren, die das Auftreten des Bugs verursacht haben. Durch die Reproduktion des Bugs können Programmierer und Ingenieure den Fehler aus erster Hand beobachten und Kontextdaten für den Rest des Debugging-Prozesses sammeln.

Schritt 2: Lokalisierung des Bugs
 

Der nächste Schritt besteht darin, die Quelle des Bugs so genau wie möglich zu lokalisieren, indem der Code gründlich untersucht und alle verfügbaren Protokolle überprüft werden. In diesem Schritt verlassen sich Entwickler in der Regel auf Debugging-Tools, die das Durchsuchen großer Code-Teile erleichtern, anstatt manuell zu arbeiten.

Schritt 3: Ermittlung der Ursache
 

Entwickler ermitteln die Ursache eines Bugs, indem sie die Logik und den Ablauf des Codes untersuchen und wie verschiedene Komponenten des Codes unter den spezifischen Bedingungen, unter denen der Fehler auftritt, interagieren.

Schritt 4: Beheben Sie den Fehler
 

Dieser Schritt umfasst in der Regel die Fehlersuche und die Überarbeitung des Codes, um das Problem zu beheben, sowie die Neukompilierung und erneute Ausführung der Software, um sicherzustellen, dass der Bug behoben ist. Diese Überarbeitungen können mehrere Iterationen umfassen, da erste Versuche fehlschlagen oder versehentlich neue Bug verursachen. 

Die meisten Entwickler verwenden ein Versionskontrollsystem, um Änderungen nachzuverfolgen. Dadurch können Änderungen, die das Problem nicht lösen oder neue Probleme verursachen, problemlos rückgängig gemacht werden. 

Schritt 5: Führen Sie einen Test durch, um die Fehlerbehebung zu validieren
 

Zu den Tests nach einem Bug-Fix gehören:

  • Unit-Tests, die das einzelne Code-Segment testen, das für den Bug-Fix geändert wurde
  • Integrationstests, die das gesamte Modul mit dem behobenen Bug testen
  • Systemtests, bei denen das gesamte System getestet wird, in dem das geänderte Modul ausgeführt wird
  • Regressionstests, die sicherstellen, dass der korrigierte Code die Anwendungsleistung nicht beeinträchtigt, d. h., dass die Anwendung aufgrund der Fehlerbehebung nicht beeinträchtigt wurde.

Schritt 6: Dokumentation des Prozesses
 

Im letzten Schritt dokumentieren die Entwickler die Details des Reparaturprozesses, einschließlich der Fehlerursache, der Fehlerbehebung und aller anderen relevanten Informationen. Die Dokumentation ist ein wertvolles Tool für Programmierer, auf das sie zurückgreifen können, wenn in Zukunft ähnliche Bugs auftreten.

Beispiele für das Debugging

Beispiele für das Debugging

Durch das Verständnis der Typen von Bugs, mit denen ein System konfrontiert ist, können Softwareingenieure und -entwickler bei Auftreten eines Bugs den richtigen Weg finden, um fehlerhaften Code zu beheben. Beispiele für häufige Bugs, die ein Debugging erfordern:

Semantische Fehler
 

Ein Code, der gegen die Regeln einer Programmiersprache verstößt, verursacht einen semantischen Fehler. Im Gegensatz zu einem logischen Fehler, der zu einem fehlerhaften Output führt, erzeugt ein semantischer Fehler keinen sinnvolle Output.

Syntaxfehler
 

Dieser Fehler tritt auf, wenn ein Entwickler ein Code-Element übersieht, z. B. eine Klammer, ein Komma oder einen anderen Tippfehler. Anders als in geschriebenen menschlichen Sprachen, wo ein Satz mit einem Tippfehler vielleicht noch verstanden wird, verursachen fehlende Codeteile sofort Fehler.

Logische Fehler
 

Diese Art von Fehler enthält eine Syntax, die technisch korrekt ist, aber falsche Anweisungen enthält, die zu einem unerwünschten Output führen. Da die Syntax korrekt ist, können diese Fehler schwer zu erkennen sein. Wenn ein System nicht sofort abstürzt und es zeitaufwendig sein kann, die genaue Stelle des falschen Codes zu finden.

Laufzeitfehler
 

Diese Fehler treten auf, wenn eine Anwendung ausgeführt oder gestartet wird. Laufzeitfehler können gelegentlich durch Aktualisieren, Neustarten oder Neuinstallieren einer Anwendung behoben werden. In anderen Fällen können sie ein Signal für ein Programm sein, das mehr Speicher benötigt, oder für einen anderen Typ von Fehler, wie z. B. einen logischen Fehler.

Typen von Debugging

Typen von Debugging

Debugging kann herausfordernd und arbeitsintensiv sein. Das Verständnis verschiedener Ansätze für den Debugging-Prozess kann die Verwaltung der Aufgabe effektiver machen.

Backtracking
 

Bei diesem Ansatz arbeiten Entwickler ab Erkennen des Fehlers rückwärts, um dessen Ursprung zu finden. Insbesondere verfolgen sie die Schritte, die das Programm mit dem problematischen Quellcode ausgeführt hat, um zu sehen, wo etwas schiefgelaufen ist. Die Rückverfolgung kann effektiv sein, wenn sie in Kombination mit einem Debugger verwendet wird.   

Ursachenbeseitigung
 

Bei der hypothesengesteuerten Debugging-Technik muss das Team über die Ursachen des Fehlers spekulieren und jede Möglichkeit unabhängig voneinander testen. Dieser Ansatz funktioniert am besten, wenn das Team mit dem Code und den Umständen, die den Bug betreffen, vertraut ist.

Erfolgreiche Arbeitsteilung
 

Beim Debuggen großer Codebasen können Teams Codezeilen in Segmente unterteilen (Funktionen, Module, Klassenmethoden oder andere testbare logische Unterteilungen) und jedes einzeln testen, um den Bug zu lokalisieren. Wenn das Problemsegment identifiziert ist, kann es weiter unterteilt und getestet werden, bis die Fehlerquelle identifiziert ist.

Print- und Log-Debugging
 

Die Print- und Log-Debugging-Strategie umfasst das Hinzufügen von Print-Statements oder „Logs”, um die Werte von Variablen, Aufrufstapel, den Kontrollfluss und andere relevante Informationen anzuzeigen. Dieser Ansatz ist besonders nützlich für die Debugging in gleichzeitigen oder verteilten Systemen, bei denen die Reihenfolge der Ausführung das Programmverhalten beeinflussen kann.

Rubber Duck Debugging
 

Bei diesem Ansatz „erklären oder sprechen“ die Entwickler den Code Zeile für Zeile zu einem beliebigen unbelebten Objekt aus. Die Idee ist, dass die Entwickler durch den Versuch, den Code laut zu erklären, seine Logik (oder das Fehlen einer solchen) besser verstehen und Fehler leichter erkennen können.

Automatisiertes Debuggen
 

Automatisiertes Debugging stützt sich auf Analysen, künstliche Intelligenz (KI) und Algorithmen für maschinelles Lernen, um einen oder mehrere Schritte des Debugging-Prozesses zu automatisieren. KI-gestützte Debugging-Tools können große Code-Mengen schneller durchsuchen, um Fehler zu identifizieren oder Codeabschnitte einzugrenzen, die anschließend von einem Entwickler gründlicher untersucht werden können.

Automatisierte Systeme können Codezeilen replizieren und Tests automatisieren, um zu überprüfen, ob ein System wie vorgesehen funktioniert. Automatisierung spielt sowohl bei der Continuous Integration (CI) als auch bei der Continuous Delivery (CD) eine wesentliche Rolle – zwei Ansätze, die das Testen und die Bereitstellung von neuem Code beschleunigen.

Brute-Force-Debugging
 

Brute-Force-Debugging wird in der Regel bereitgestellt, wenn andere Methoden versagt haben. Dabei wird die gesamte Codebasis Zeile für Zeile durchlaufen, um die Ursache des Problems zu ermitteln. Diese zeitaufwendige Vorgehensweise kann auch beim Debugging kleiner Programme nützlich sein, wenn der Ingenieur oder Programmierer, der das Debugging durchführt, nicht mit der Codebasis vertraut ist.

 

Debugging-Tools

Debugging-Tools

Debugger sind fortschrittliche Tools und APIs, die die Softwareentwicklung optimieren, indem sie Codierungsfehler in einem Betriebssystem oder einem Anwendungsentwicklungsprozess lokalisieren. Debugger stellen ein riesiges und wachsendes Geschäft dar. Angesichts der ständig wachsenden Zahl von Computern, Mobile Apps und Programmen ist es nicht verwunderlich, dass der weltweite Debugger-Markt bis zum Ende des Jahrzehnts voraussichtlich erheblich wachsen wird1 .

Unternehmen investieren Millionen in die Entwicklung ausgeklügelter Debugging-Tools (wie intelligente Chatbots, die Code debuggen können)2,  und Forscher an Universitäten entwickeln Tools, die Videospiele3 und domänenspezifische Programmiersprachen eigenständig debuggen können4.

Die Funktionen der Tools und Technologien können stark variieren, aber im Wesentlichen bieten sie alle Befehlszeilenschnittstellen, die Unternehmen dabei helfen, Bugs zu finden und zu beheben. Die meisten bieten auch Remote-Debugging-Funktionen und Tutorials an, die die Software für Anfänger zugänglicher machen.

Beispiele für Debugging-Tools sind:

Integrated Development Environments (IDEs)
 

IDEs bieten Computerprogrammierern umfassende Funktionen für die Softwareentwicklung. Viele IDEs wie Visual Studio, Eclipse und PyCharm verfügen über einen „Debug-Modus“. Diese integrierten Debugging-Tools ermöglichen es Entwicklern, Code Zeile für Zeile auszuführen (Schritt-Debugging), die Programmausführung an bestimmten Punkten zu stoppen (Breakpoints) und den Zustand von Variablen und Speicher zu jedem Zeitpunkt zu untersuchen. Weitere Funktionen sind möglich. 

IDEs sind auch als Open-Source-Plug-ins verfügbar, die mit einer Reihe von Programmiersprachen wie Java, Python, JavaScript und TypeScript sowie Skriptsprachen wie PHP kompatibel sind.

Eigenständige Debugger
 

Eigenständige Debugger wie der GNU Debugger (GDB) bieten erweiterte Debugging-Funktionen, darunter bedingte Breakpoints und Watchpoints. Sie erleichtern zudem das Reverse Debugging, bei dem Programmierer ein Programm rückwärts ausführen. Sie sind in der Regel leistungsfähiger und vielseitiger als Debugger, die in IDEs oder andere Developer Tools integriert sind. Allerdings ist die Lernkurve für Benutzer steiler und es ist mehr technisches Fachwissen erforderlich. 

Dienstprogramme zur Protokollierung
 

Diese Tools bieten Möglichkeiten, den Status eines Programms an verschiedenen Stellen im Code zu protokollieren. Die Protokolle können anschließend analysiert werden, um Anomalien oder problematische Muster zu finden. Die Protokollierung ist nützlich, um Bugs zu beheben, die in Produktionsumgebungen auftreten, in denen interaktives Debugging möglicherweise nicht möglich ist. 

Statische Code-Analysatoren
 

Statische Code-Analyse-Tools analysieren Code, ohne ihn auszuführen, und suchen nach potenziellen Fehlern,  beheben Bugs und Abweichungen von Codierungsstandards. Anstatt sich auf die Syntax zu konzentrieren (wie es Interpreter und Compiler tun), analysieren diese Tools die Semantik des Quellcodes und helfen Entwicklern, häufige Programmierfehler zu erkennen und konsistente Programmierstile durchzusetzen. 

Dynamische Analysetools
 

Dynamische Analysetools sind im Grunde das Gegenteil von statischen Code-Analysatoren. Sie überwachen die Software, während sie läuft, um Probleme wie Ressourcenlecks oder Parallelitätsprobleme zu erkennen. Dieses Tool hilft Entwicklungsteams, Fehler zu finden, die bei der statischen Analyse möglicherweise übersehen werden, wie z.B. Speicherlecks oder Pufferüberläufe.

Performance-Profiler
 

Mit Performance-Profilern können Entwickler Schwachstellen in ihrem Code identifizieren. Diese Systeme können die CPU-Auslastung, die Speicherauslastung und die E/A-Operationen messen und helfen dabei, langsame und ineffiziente Vorgänge zu lokalisieren.

Debugging vs. Testing

Debugging vs. Testing

Testen und Debuggen sind ergänzende Prozesse bei der Entwicklung neuen Codes. Auch wenn die Ergebnisse unterschiedlich ausfallen, dienen sowohl Tests als auch Debugging dazu, fehlerfreien Code zu erstellen.

Durch Tests können Softwareentwickler verstehen, was mit einem System passiert, wenn Fehler auftreten. Mithilfe dieser Tests erkennen Entwickler, wann ein Systemfehler aufgetreten ist und welche Auswirkungen dieser Fehler auf eine Software haben könnte. Durch automatisierte Tests können Entwickler kontinuierlich Tests an neuem Code durchführen, um Einblicke in verschiedene Szenarien zu erhalten. Das Testen ist ein wichtiger Bestandteil der Softwareentwicklung, aber es erklärt nicht, warum ein Fehler aufgetreten ist.

Entwickler nutzen Debugging-Strategien und -Tools, um die Grundursache von Fehlern zu finden, sie zu beheben und zu dokumentieren, um ein erneutes Auftreten zu verhindern. Wenn Debugging und Testen gemeinsam verwendet werden, können Teams einen optimierten Ansatz für die Code-Entwicklung und die Erstellung besserer Softwareprodukte entwickeln.

Weiterführende Lösungen

Weiterführende Lösungen

IBM Instana Observability

Die Instana Observability-Plattform stellt Echtzeit-Leistungsdaten mit vollständigem Kontext für alle deine Teams bereit. Automatisierte Full-Stack-Visualisierung, sekundengenauer Granularität und 3 Sekunden bis zur Benachrichtigung ermöglichen eine schnelle Identifizierung, um Probleme zu verhindern und zu beheben.

IBM Instana Observability kennenlernen Fordern Sie eine IBM Instana-Demo an
IBM Turbonomic

Mit der IBM Turbonomic-Plattform zur Optimierung der Kosten für die Hybrid Cloud können Sie kontinuierlich kritische Aktionen in Echtzeit automatisieren, die proaktiv die effizienteste Nutzung von Rechen-, Speicher- und Netzwerkressourcen für Ihre Anwendungen auf jeder Ebene des Stacks ermöglichen. 

IBM Turbonomic erkunden Testen Sie IBM Turbonomic kostenlos
IBM Cloud Pak for AIOps

Verschaffen Sie sich mit KI-gestützten Tools, die beim Vorfallsmanagement und der Fehlerbehebung helfen, einen Überblick über Daten und Abhängigkeiten in IT-Umgebungen.

Entdecken Sie IBM Cloud Pak for AIOps Zur selbstgesteuerten Tour
Ressourcen

Ressourcen

Was sind Softwaretests?

Softwaretests sind der Prozess der Überprüfung, ob ein Softwareprodukt oder eine Anwendung das tut, was sie tun sollen.

Was versteht man unter Beobachtbarkeit?

Beobachtbarkeit bietet tiefe Einblicke in moderne verteilte Anwendungen für eine schnellere, automatisierte Problemerkennung und -lösung.

Die CI/CD-Pipeline

Die CI/CD-Pipeline (Continuous Integration and Continuous Delivery) optimiert den Produktentwicklungsprozess.

Erfahren Sie, wie eine Kombination aus beobachtbaren IT-Komponenten, maschinellem Lernen und künstlicher Intelligenz (KI) Softwareprobleme erkennt, bevor sie zu Vorfällen werden.

Routing-Observability-Log und Ereignisdaten

Erfahren Sie, wie wichtig das sichere Routing von Protokoll- und Ereignisdaten mit IBM Cloud Logs ist.

IBM Test Accelerator for Z

Der IBM Test Accelerator bietet leistungsstarke Tools für automatisierte Tests, kontinuierliche Bereitstellung und optimierte Workflows in der Entwicklung.

Machen Sie den nächsten Schritt

IBM Debug for z/OS bietet Debugging- und Codeabdeckung für z/OS Anwendungen, die in COBOL, PL/I, C/C++ und Assembler geschrieben wurden.

IBM Debug for z/OS
Fußnoten

1 „Global software debugging market analysis [2023-2030],” Benzinga, 5. September 2022
2 „Google’s Bard AI chatbot can now generate and debug code,” TechCrunch+, 12. April 2023
3 „Autonomously debugging video games.” University of Southern California-Viterbi School of Engineering, 5 April 2023
4 „An easier way to get bugs out of programming languages,” MIT News, 7. April 2023