Debugging
Was ist Debugging?
Debugging ist in der Computerprogrammierung und -technik ein mehrstufiger Prozess, bei dem ein Problem identifiziert, die Ursache des Problems isoliert und dann entweder das Problem behoben oder eine Möglichkeit gefunden wird, es zu umgehen. Der letzte Schritt des Debuggings besteht darin, die Korrektur oder Umgehung zu testen und sicherzustellen, dass sie funktioniert.
In der Softwareentwicklung beginnt der Debugging-Prozess, wenn ein Entwickler einen Codefehler in einem Computerprogramm findet und diesen reproduzieren kann. Debugging ist Teil des Softwaretestprozesses und ein integraler Bestandteil des gesamten Softwareentwicklungslebenszyklus.
In der Hardwareentwicklung werden beim Debugging-Prozess Hardwarekomponenten gesucht, die nicht richtig installiert oder konfiguriert sind. Beispielsweise kann ein Ingenieur einen JTAG-Verbindungstest durchführen, um Verbindungen auf einem integrierten Schaltkreis zu debuggen.
Wie Debugging in Software funktioniert
Der Debugging-Prozess beginnt, sobald Code geschrieben wird, und setzt sich in aufeinanderfolgenden Phasen fort, während der Code mit anderen Programmeinheiten kombiniert wird, um ein Softwareprodukt zu bilden. In einem großen Programm mit Tausenden und Abertausenden von Codezeilen kann der Debugging-Prozess durch den Einsatz von Strategien wie Unit-Tests (Modultests), Code-Reviews und Pair-Programming erleichtert werden.
Um Fehler zu identifizieren, kann es nützlich sein, sich die Protokollierung des Codes anzusehen und ein eigenständiges Debugging-Tool oder den Debug-Modus einer integrierten Entwicklungsumgebung (IDE) zu verwenden. An dieser Stelle kann es hilfreich sein, wenn der Entwickler mit Standardfehlermeldungen vertraut ist. Wenn Entwickler beim Schreiben von Code nicht angemessen kommentieren, kann selbst der sauberste Code für jemanden, der ihn debuggen möchte, eine Herausforderung darstellen.
In manchen Fällen ist das Modul, das das Problem verursacht, offensichtlich, während die Codezeile selbst nicht offensichtlich ist. In diesem Fall können Modultests – wie JUnit und xUnit, die es dem Programmierer ermöglichen, eine bestimmte Funktion mit bestimmten Eingaben auszuführen – beim Debugging hilfreich sein.
Die Standardmethode besteht darin, einen Haltepunkt einzurichten und das Programm bis zu diesem Haltepunkt auszuführen. Zu diesem Zeitpunkt wird die Programmausführung angehalten. Die Debugger-Komponente einer IDE bietet dem Programmierer die Möglichkeit, den Speicher und die Variablen anzuzeigen, das Programm bis zum nächsten Haltepunkt auszuführen, die nächste Codezeile auszuführen und in einigen Fällen den Wert von Variablen oder sogar den Inhalt der auszuführenden Codezeile zu ändern.
Warum ist Debugging wichtig?
Das Debugging ist ein wichtiger Bestandteil bei der Ermittlung der Ursache für das Fehlverhalten eines Betriebssystems, einer Anwendung oder eines Programms. Selbst wenn Entwickler denselben Programmierstandard verwenden, ist es immer noch wahrscheinlich, dass ein neues Softwareprogramm Fehler aufweist. In vielen Fällen kann der Prozess des Debuggens eines neuen Softwareprogramms mehr Zeit in Anspruch nehmen als das Schreiben des Programms. Die Fehler in den am häufigsten verwendeten Softwarekomponenten werden immer zuerst gefunden und behoben.
Debugging versus Testen
Debugging und Testen sind komplementäre Prozesse. Der Zweck des Testens besteht darin, zu ermitteln, was passiert, wenn ein Fehler im Quellcode eines Programms vorliegt. Der Zweck des Debuggens besteht darin, den Fehler zu lokalisieren und zu beheben.
Der Testprozess hilft dem Entwickler nicht dabei, den Programmierfehler zu ermitteln – er zeigt lediglich, welche Auswirkungen der Programmierfehler auf das Programm hat. Sobald der Fehler identifiziert wurde, hilft das Debugging dem Entwickler, die Ursache des Fehlers zu ermitteln, damit er behoben werden kann.
Beispiele für häufige Programmierfehler
Zu den häufigsten Programmierfehlern gehören:
- Syntaxfehler
- Laufzeitfehler
- semantische Fehler
- logische Fehler
- Missachtung der im Programmierstandard festgelegten Konventionen
- Aufruf der falschen Funktion
- Verwendung des falschen Variablennamens an der falschen Stelle
- Versäumnis, eine Variable zu initialisieren, wenn dies unbedingt erforderlich ist
- Überspringen einer Überprüfung auf eine Fehlerrückgabe
Debugging-Strategien
Quellcode-Analysatoren, die Sicherheits-, allgemeine Code-Fehler- und Komplexitätsanalysen umfassen, können beim Debugging hilfreich sein. Ein Komplexitätsanalysator kann komplizierte Module finden, die schwer zu verstehen und zu testen sind. Zu den weiteren Debugging-Strategien gehören:
- Statische Analyse. Der Entwickler untersucht den Code, ohne das Programm auszuführen.
- Print Debugging (auch als Tracing bezeichnet). Der Entwickler beobachtet Live- oder aufgezeichnete Print-Anweisungen und überwacht den Ablauf.
- Remote-Debugging: Der Debugger des Entwicklers läuft auf einem anderen System als das Programm, das debuggt wird.
- Post-Mortem-Debugging: Der Entwickler unterbricht das Programm nur dann, um es zu debuggen, wenn schwerwiegende Ausnahmen auftreten.
Debugging-Tools
Ein Debugger ist ein Software-Tool, das den Softwareentwicklungsprozess unterstützen kann, indem es Codierungsfehler in verschiedenen Phasen der Betriebssystem- oder Anwendungsentwicklung identifiziert.
Einige Debugger analysieren einen Testlauf, um festzustellen, welche Codezeilen nicht ausgeführt wurden. Andere Debugging-Tools bieten Simulatoren, mit denen der Programmierer modellieren kann, wie eine App auf einem bestimmten Betriebssystem oder Computergerät angezeigt wird und sich verhält.
Viele Open-Source-Debugging-Tools und Skriptsprachen laufen nicht in einer IDE, sodass sie einen eher manuellen Ansatz für das Debugging erfordern. So ermöglicht beispielsweise das USB-Debugging die Kommunikation eines Android-Geräts mit einem Computer, auf dem das Android SDK ausgeführt wird.
In dieser Situation kann der Entwickler ein Programm debuggen, indem er Werte in ein Protokoll einfügt, umfangreiche Print-Anweisungen zur Überwachung der Codeausführung erstellt oder fest codierte Wartebefehle implementiert, die einen Haltepunkt simulieren, indem sie in bestimmten Intervallen auf Tastatureingaben warten.
Herausforderungen beim Debugging
Der Debugging-Prozess kann ziemlich schwierig sein und genauso viel Arbeit erfordern – wenn nicht sogar mehr – wie das Schreiben des Codes. Der Prozess kann besonders schwierig sein, wenn:
- Die negativen Auswirkungen des Programmierfehlers klar sind, die Ursache jedoch nicht.
- Die negativen Auswirkungen des Programmierfehlers schwer zu reproduzieren sind – beispielsweise wenn Webinhalte Dropdown-Menüs enthalten.
- Abhängigkeiten sind nicht klar, sodass die Behebung eines Programmierfehlers in einem Teil des Programms versehentlich neue Fehler in anderen Teilen des Programms verursacht.
Geschichte des Debuggings
Die Verwendung des Wortes Bug als Synonym für Fehler stammt aus dem Ingenieurwesen. Die Anwendung des Begriffs auf die Informatik und die Inspiration für die Verwendung des Wortes Debugging als Synonym für Fehlerbehebung wird Admiral Grace Hopper zugeschrieben, einer Pionierin der Computerprogrammierung.

Als sich ein echter Käfer (eine Motte) zwischen elektrischen Relais verfangen hatte und ein Problem im ersten Computer der US-Marine verursachte, „debuggten“ Admiral Hopper und ihr Team den Computer und retteten die Motte. Sie befindet sich heute im Smithsonian Museum.