… und wie wird er von Entwicklern genutzt?
Ein Debugger-Programm ermöglicht es Benutzern und Entwicklern, ein anderes Programm zeilenweise anzuzeigen. Auf diese Weise können Entwickler falschen Code identifizieren, herausfinden, wie ein Programm abläuft und notwendige Optimierungen daran vornehmen.
Was ist ein Debugger?
Beim Debuggen werden vorhandene und potenzielle Fehler, auch als “Bugs” bezeichnet, in einem Software-Code erkannt und beseitigt, die zu unerwartetem Verhalten oder Abstürzen führen können. Ein Debugger ist ein Programm, das bei diesem Prozess unterstützend eingesetzt wird.
Fehler beheben
Um einen fehlerhaften Betrieb einer Software oder eines Systems zu verhindern, wird ein Debugger verwendet, um Fehler oder Defekte zu finden und zu beheben. Wenn verschiedene Subsysteme oder Module eng miteinander verbunden sind, wird das Debuggen schwieriger, da jede Änderung an einem Modul dazu führen kann, dass mehr Fehler in einem anderen auftreten. Manchmal dauert das Debuggen eines Programms länger als das Codieren. Um ein Programm zu debuggen, muss der Benutzer mit einem Problem beginnen, den Quellcode des Problems eingrenzen und es dann beheben. Ein Benutzer eines Programms muss wissen, wie das Problem behoben werden kann, da Kenntnisse über die Problemanalyse erwartet werden. Wenn der Fehler behoben ist, ist die Software einsatzbereit.
Ursache zu lokalisieren
Debugging-Tools werden verwendet, um Codierungsfehler in verschiedenen Entwicklungsstadien zu identifizieren. Sie werden verwendet, um die Bedingungen zu reproduzieren, unter denen ein Fehler aufgetreten ist, und dann den Programmstatus zu diesem Zeitpunkt zu untersuchen und die Ursache zu lokalisieren. Programmierer können die Programmausführung schrittweise verfolgen, indem sie den Wert von Variablen auswerten und die Ausführung an den erforderlichen Stellen anhalten, um den Wert von Variablen abzurufen oder die Programmvariablen zurückzusetzen. Einige Programmiersprachenpakete bieten einen Debugger zum Überprüfen des Codes auf Fehler, während dieser zur Laufzeit geschrieben wird. Ein Debugger ist sehr nützlich, um semantische Fehler im Programm zu finden. Die Verwendung eines Debuggers erfordert zwar einige Übung, lohnt sich jedoch, da sein Einsatz die Zeit für die Perfektionierung eines Programms verkürzt wird.
Wie funktioniert ein Debugger?
Die Details der Funktionsweise eines Debuggers hängen davon ab, was debuggt wird und welches Betriebssystem verwendet wird. Der Benutzer teilt dem Debugger mit, an welchen Prozess er anknüpfen soll, entweder einen Namen oder nach Prozess-ID. Wenn es sich um einen Namen handelt, schlägt der Debugger die Prozess-ID nach und leitet die Debugsitzung über einen Systemaufruf ein. Nach dem Anknüpfen tritt der Debugger in eine Ereignisschleife ein, ähnlich wie bei jeder Benutzeroberfläche. Anstelle von Ereignissen, die vom Fenstersystem stammen, generiert das Betriebssystem Ereignisse basierend auf dem Vorgang, der während des Debuggens ausgeführt wird. Der Debugger kann den virtuellen Speicher des Zielprozesses lesen und schreiben sowie seine Registerwerte über vom Betriebssystem bereitgestellte APIs anpassen. Außerdem kann der Debugger Informationen aus Symboldateien verwenden, um Adressen in Variablennamen und Speicherorte im Quellcode zu übersetzen. Die Informationen in der Symboldatei sind ein separater Satz von APIs und kein Kernbestandteil des Betriebssystems. Wenn Entwickler eine verwaltete Umgebung debuggen, sieht der Prozess normalerweise ähnlich aus, die Details unterscheiden sich jedoch, da die Umgebung der virtuellen Maschine die Debug-API und nicht das zugrunde liegende Betriebssystem bereitstellt.
Eigenschaften und Besonderheiten von Debuggern
Debugger-Programme bieten grundlegende Funktionen wie Symbol-Resolver, Abfrageprozessor, Ausdrucksinterpreter und andere. In einigen Debugger-Programmen gibt es eine Funktion, die als Reverse Debugging bezeichnet wird. Dies ermöglicht den Benutzern, die Programmausführung rückwärts anzuzeigen. Reverse-Debugging wird nicht häufig verwendet, ist jedoch eine sehr nützliche Funktion.
Wie können Entwickler Debugger nutzen?
Abhängig von der Programmiersprache müssen Entwickler möglicherweise verschiedene Dinge debuggen. Viele Entwickler verbringen Zeit beim Debuggen von Stapeln. Der Stapel besteht aus den Funktionsschichten, aus denen ein Programm besteht. Das Anhalten der Stapelausführung ist das A und O beim Debuggen. So können Entwickler jederzeit sehen, was in einer Funktion geschieht. Dies ist zum Beispiel äußerst nützlich, wenn sie versuchen, die Ursache eines Fehlers ausfindig zu machen und mögliche Annahmen über die Funktionsweise einer Funktion zu überprüfen. In einigen Sprachen wie C muss ein Entwickler möglicherweise den Speicher verwalten. Speicher-Debugger helfen Entwicklern beim Debuggen von Dingen wie einem Speicherüberlauf oder einer falschen Garbage Collection. Die meisten modernen Sprachen kommen damit zurecht, sodass das Debuggen des Speichers heutzutage weniger nützlich ist. Mit einigen Debugger wie gdb können Entwickler einen Blick in kompilierten Code werfen. Viele moderne Debugger übernehmen Ideen von gdb, so dass Sie im Code Haltepunkte setzen können und mit den Anweisungen next und continue durch den Code gehen können. Das Debuggen von Ausgaben ist ein guter Weg, um zu sehen, welche Annahmen Entwickler möglicherweise über eine Funktion oder ein Programm treffen. Dies geschieht meistens durch Löschen von Konsolenprotokollanweisungen und Drucken von Variablenwerten, während eine Funktion ausgeführt wird. Schließlich müssen Entwickler manchmal die Metadaten für eine Funktion testen, beispielsweise, was gespeichert wird, was protokolliert wird und auf welche APIs von Drittanbietern zugegriffen wird.
Fazit
Das Debuggen ist eine wichtige Fähigkeit in der Programmierung und Entwickler investieren in der Regel viel Zeit darin zu lernen, wie man es richtig macht. Debuggen ist größtenteils eine Kunst, denn es gibt keinen einen und einzigen Weg, der hier der richtige ist. Entwicklern stehen deshalb eine Reihe von Debugging-Tools für verschiedene Zwecke zur Verfügung und es lohnt sich sicherlich für jeden Entwickler seinen Erfahrungshorizont mit diesen Tools kontinuierlich zu erweitern.