Debugging

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