Universität Bayreuth Mathematisches Institut Erste Schritte Mail und News KDE LaTeX/TeX Linksammlung Linuxtools Netzwerk Programmieren Windows X Window Anträge Kontakt |
Programmieren
Fehlersuche mit dem DebuggerInhaltsverzeichnis
Programmiertipps
Fehlerarten und typische Fehlerquellen Beim Programmieren spricht man von syntaktischen und semantischen Fehlern. Die syntaktischen sind die, die auftreten, wenn man sich bei Schlüsselwörter oder Variablennamen vertippt hat. Die anderen Fehler, die das Ergebnis des Programms verändern können, sind die semantischen. An diesen zwei Fehlertypen kann man verschiedene Fehlerarten erkennen. semantische FehlerMan spricht von einem Designfehler, wenn der Code zu einem anderen Verhalten führt, als der Programmier beabsichtigte.Beispiel: Oder while (var<10); /* Hier gibt es ein Semikolon zu viel. Die while-Schleife ist leer. */ var+=1; cout<<var<<endl; Datenveränderung (Seiteneffekte)In seltenen Fällen ist dieser Effekt durch Wechselwirkungen mit anderen Programmen bedingt. Unter Linux ist dieses Problem weniger zu befürchten , da die Prozesse streng voneinander abgetrennt sind und das Betriebssystem bereits verhindert, dass sich zwei Anwendungen ins Gehege kommen. Manchmal kann aber auch Ihr Programm selbst daran schuld sein; die häufigsten Ursachen sind Überschreitungen von Feldgrenzen, Überlauf von Variablen und fehlerhaftes Verwenden von Zeigern.bedingte KompilierungMan baut sehr oft Ausdruckanweisungen im Programm bei der Fehlersuche ohne Benutzung eines Debugger. Diese Ausdruckanweisungen sollen aber nicht in der endgültigen Version enthalten sein. Das kann so aussehen:... #ifdef DEBUG cout<<"Ergebnis = "<<var<<endl; #endif ...Wenn Sie dann ein abschliessendes "#endif" vergessen zu löschen und ein weiteres stehen haben, kann ein Teil des Programmes nicht ausgeführt werden. Rechen-und RundungsfehlerDiese treten meistens auf und sind nur schwer zu verhindern. Sie können beispielsweise Auslöschungen bewirken, die bei Verknüpfungen von sehr großen und sehr kleinen Zahlen miteinander auftreten. Vertauschung von Variablen innerhalb eines nicht assioziatives Ausdruckes kann auch zu einem Fehler führen. Oder auch bei Überläufen, da ganzzahlige Datentypen nur einen begrenzten Wertebereich haben.zum Beispiel ... short int i,j,k; i=32700; /* Mit dieser Rechnung erhalten wir j=-32768, aber wir wissen,dass die Summe zweier positiver Zahlen nicht negativ sein kann. */ j=i+68; ...Auch mit dem Mischen von Werten mit und ohne Vorzeichen (signed und unsigned), z.B. in Vergleichen, muss man sehr vorsichtig sein. Fehler mit Zeigern und dynamischer Speicherverwahltung (Abstürze und core-Datei)Die häufigsten Ursachen von Totalabstürzen sind Fehler beim Umgang mit Zeigern oder der dynamischen Speicherverwahltung, Zuweisungen auf Nullzeiger, ... . Obwohl dieses Problem nicht so oft unter Linux wie unter Windows auftritt, wird unter Linux bei jedem Absturz ein Speicherauszug (core dump) erstellt. Diesen können Sie dann in den Debugger laden und damit die genaue Stelle des Abstürz erfahren.
Fehlersuche ohne Debugger Fehler kann man auch im Programm suchen ohne Benutzung eines Debugger, indem man printfs oder couts im Programm einbaut. Mit diesen ausgaben kann man das Verhalten des Programms folgen und die genaue Stelle des Fehlers finden.Man kann auch die "bedingte übersetzung" benutzen. Diese sind Anweisungen, die in bestimmten Fällen vom Compiler ignoriert werden. Ein Beispiel ... #ifdef DEBUG cout<<Hier ist ein Fehler<<endl;(oder eine beliebige andere Anweisung) #endif ...Hier werden die Anweisungen zwischen # ifdef und # endif übersetzt nur wenn die Varialbe DEBUG definiert ist, und dies dies kann im Code (mit # define)oder bei der Kompilierung erfolgen.Damit kann man einige Teile des Programm prüfen und andere ignorieren. Aber Diese bedingte Übersetzungen köauch Fehler verursachen. (siehe bedingte Kompilierung )
Allgemeines zum Debugger Beim Entwickeln und Testen Ihrem Programm ist es wichtig, daß Sie evtl. darin enthaltene Fehler finden und beheben können. Der Begriff Debugger kommt von Bug. Ein Bug (Englisches Wort ,bedeutet auf Deutsch Käfer ) in einem Programm ist ein Fehler, den Sie beheben wollen. Sie verwenden den Debugger, wenn ein Fehler aufgetreten ist oder Sie die Ausführung Ihrem Programm überwachen müssen. Der Debugger unterstützt Sie bei der Fehlersuche, sie können damit Ihr Programm schrittweise durchlaufen und den Inhalt von Variablen überprüfen.Es gibt verschiedene Debugger unter Windows und Linux. Der verbreitetste unter Linux ist der gdb (Gnu DeBugger). Der gdb ist sehr leistungsfähig aber, weil er nur eine Kommandozeile hat, ist er schwer zu bedienen. Um die Benutzung der gdb zu erleichtern wurde der ddd (Data Display Debugger) entwickelt. Der ddd ist eine grafische Benutzerschnittstelle zum gdb aber nicht die einzige (es gibt auch der xxgdb, der tgdb, der SNIFF-Debugger und viele andere). Der ddd ist einfach populärer wegen seiner Fähigkeit, komplexe Datenstrukturen als Graphen zu visualisieren. Der ddd erspart dem Benutzer die Eingabe den gdb-Befehle auf der Kommandozeile und beschränkt die Bedienung auf Mausklicks. Unter Windows gibt es auch gute Debugger wie beispielsweise der watcom-Debugger. Glossar (Definitionen)
Links und Bücherempfehlung
|