Debugging

Debugging

Copyright © Shutterstock/ Dusit srisory

Was bedeutet Debugging?

Definiton

Debugging bezeichnet in der Software-Entwicklung den Prozess des Auffindens und Behebens von Fehlern. Ein Fehler wird in der englischen Sprache auch als “Bug” bezeichnet. Viele Compiler verfügen über einen eigenen Debugger, der bei der Diagnostik von Programmfehlern hilft.

Lange Zeit wurde vermutet, die Begriffe “Bug” und “Debugging” gingen auf die amerikanische Informatikerin und Flottenadmiralin Grace Hopper zurück. Als eine Motte im Relais eines Mark II Computers steckenblieb, bezeichnete Hopper die Wartungsarbeiten als “Debugging”. Mit Bug wird in der englischen Sprache nicht nur ein technischer Fehler bezeichnet, sondern auch ein Insekt. Allerdings gehen Etymologen heute davon aus, dass der Begriff “Bug” bereits im 19. Jahrhundert verwendet wurde und auf den Erfinder Thomas Edison zurückzuführen ist.

Bei einfachen Fehlern weist eine moderne Entwicklungsumgebung (IDE) den Programmierer schon kurz nach der Eingabe des fehlerhaften Codes auf den diagnostizierten Fehler hin. Die problematische Stelle wird dann mit einer roten Linie unterstrichen. In der Regel handelt es sich hierbei um sehr einfache Bugs, wie etwa einen syntaktischen oder lexikalischen Fehler. Diese Fehlertypen können in Sekundenschnelle behoben werden. Bei einem syntaktischen Fehler etwa durch das Hinzufügen eines Semikolon am Ende einer Zeile. Auch beim Kompilieren des Programms werden alle Fehlerstellen gesammelt. In der Debugging-Konsole findet man dann den jeweiligen Programmabschnitt und die entsprechende Zeilennummer.

Schwerwiegender sind hingegen Laufzeitfehler (Runtime Error), die erst nach dem Ausführen des Programms auftreten. Diese können dazu führen, dass sich das Programm unerwartet verhält oder sogar ganz abstürzt. Um diese aufzufinden, muss der Programmierer einen sogenannten Breakpoint in der Zeile setzen, in der er das Auftreten des Fehlers vermutet. Der Programmablauf wird an dieser Stelle angehalten. Anschließend kann der Programmierer durch jeden Programmschritt gehen und erhält vom Debugger weitere Informationen. Nachdem der Bug beseitigt wurde, wird das Programm noch einmal neu kompiliert. Alle Dateien des Programms werden aktualisiert. Diese Aktualisierung des Programms, die sich nur auf die Fehlerbeseitigung konzentriert, nennt man auch Patch. Dieser ist von einem Update zu unterscheiden, das neue Inhalte zum Programm hinzufügt.

Die Steuerung des Debugging

Zum Debugging gehört das Austesten des Programmablaufs. Schwerwiegende Fehler treten erst nach der Programmausführung auf. Mit Hilfe eines Debuggers kann das Programm Schritt für Schritt überprüft werden. Es bieten sich für den Programmierer verschiedene Steuerungsmöglichkeiten an. In den meisten Entwicklungsumgebungen geschieht dies über eine eigene Debugging-Konsole.

  1. Der Watchpoint ist ein Überwachungspunkt, bei dem die Werte von Variablen während der Programmausführung beobachtet werden können. Im Unterschied zu einem Breakpoint sind sie nicht an eine feste Stelle geknüpft, sondern werden durchweg während des gesamten Ablaufs überwacht.
  2. Der Breakpoint ist ein Haltepunkt, der vom Programmierer bewusst an einer bestimmten Stelle des Programms gesetzt wird. Das Programm wird anschließend an der Stelle unterbrochen und der Programmierer kann Schritt für Schritt durch den weiteren Ablauf des Programms gehen. Dies ist sehr sinnvoll, wenn man beobachten möchte, ob etwa logische Statements korrekt ausgeführt werden oder um zu sehen, wie Speicheradressen beschrieben werden.
  3. Mit Tracepoint bezeichnet man einen Verfolgungspunkt, der eine festgelegte Aktion auslöst, sobald der Punkt im Programmablauf erreicht wird.

Draw Debugging

In 3D-Engines wie etwa Unreal oder Unity gibt es außerdem die Möglichkeit, dass ein 3D-Objekt, etwa eine Gitternetz-Kugel oder eine Linie, gezeichnet werden können. Ein Beispiel hierfür wäre etwa, wenn man überprüfen möchte, ob eine Sichtlinie zwischen zwei Objekten besteht und sich die Objekte sehen können. Trifft dies zu, so wird eine Debug-Kugel an der Stelle gezeichnet (Drawing), an der das betrachtete Objekt zuletzt gesehen wurde.

Die verschiedenen Fehlertypen

Ein syntaktischer Fehler tritt dann auf, wenn gegen die syntaktischen Regeln der Programmiersprache verstoßen wird. Ein Beispiel wäre etwa, dass man das Ende eines Statements nicht mit einem Semikolon kennzeichnet. Diese Fehlerart kann in der Regel sehr schnell behoben werden und die IDE weist schon in Echtzeit auf den Fehler hin.
Dieser Fehlertyp ist schwerer nachzuvollziehen, denn in der IDE wird zunächst kein Fehler angezeigt. Erst beim Ausführen des Programms macht sich der Logikfehler bemerkbar. Etwa wenn Werte plötzlich falsch berechnet werden oder das Programm unerwartet abstürzt.
Wird eine Klasse nicht zu Beginn des Quellcodes deklariert, so entsteht ein lexikalischer Fehler. Denn das Programm weiß nicht, woher es die notwendigen Informationen beziehen soll. Zur Deklarierung gibt es mehrere Wege. Etwa eine Forward-Declaration, bei der einfach die Klasse genannt wird. Oder eine Include-Declaration, bei welcher die Header-File der jeweiligen Klasse inkludiert wird. Generell ist ein lexikalischer Fehler dann vorhanden, wenn die Zeichenkette nicht vom Compiler interpretiert werden kann.
Die Endlosschleife ist ein Fehler, der in der Praxis häufig auftritt. Zum Beispiel wird bei einem While-Loop nicht die bestimmte Bedingung erfüllt, die die Schleife auflöst. Das Programm kehrt immer wieder zum Schleifenanfang zurück und kann keinen Weg mehr aus der Schleife finden.

Methoden

Bei dieser Methode wird zuerst ein Speicherabbild des fehlerhaften Programms erstellt. Im Englischen wird dies auch als Memory Dump bezeichnet. Dies ist etwa empfehlenswert, wenn das Programm unerwartet den Ablauf abbricht. Anschließend kann genau mit Hilfe des Speicherabbildes ermittelt werden, an welcher Stelle der Fehler im Programm auftritt.
Das genaue Gegenteil des Post-Mortem Debuggings. Bei Just-in-Time wird direkt beim Programmabsturz der Debugger geöffnet und erstellt einen Statusbericht des Programms bis hin zu der Stelle, an welcher das Programm abgestürzt ist.
Mit dem Print-Befehl kann man sich beim Programmablauf die Werte anzeigen lassen, die man zuvor in einer Kalkulation erstellt hat. Es ist eine einfache und zeitsparende Methode, um schnell zu ermitteln, ob Werte richtig berechnet werden.
Bei dieser Methode wird das Programm auf einem anderen Computer ausgeführt. Hierzu wird ein Netzwerk benötigt, in welchem der Remote-Computer und Debug-Computer miteinander verbunden sind. Anschließend kann man mit Hilfe des Debugger prüfen, ob die Werte auf dem anderen System korrekt abgebildet werden. Dies ist bei Netzwerkapplikationen notwendig.

Sie haben noch Fragen?

Kontaktieren Sie uns

Kostenloser SEO-Check der OSG


Weitere Inhalte