5.2.20
03/29/20

Diff for EclipseDebugging between 11 and 12

[[toc]]
+ Debugging eines C-Projekts mit Eclipse
++ Allgemeines
Eine integrierte Entwicklungsumgebung (IDE) wie Eclipse unterstützt den Programmierer \
auch in der Behebung von Programmfehlern.
Solche Programmfehler, die meist auf fehlerhafter oder unzureichender Umsetzung eines Algorithmus beruhen, \
werden **Bugs** (=Käfer, Wanze) genannt.
Um solchen Problemen auf die Schliche zu kommen wird ein **Debugger** genutzt.

Eclipse verwendet den **GNU Debugger** (gdb) und bietet dem Entwickler mithilfe der grafischen Umgebung \
eine bequeme Art die Möglichkeiten des Debuggers zu nutzen. Diese sind u. a.:

* Durchlaufen des Programms im Einzelschrittmodus (//Step Over//, //Step Into//)
* Durchlaufen des Programms bis zu einem vorher festgelegten Haltepunkt (//Breakpoint//)
* Beobachten (und Modifikation) der Variableninhalte
* Unterbrechen des Programmablaufs _
(Besonders interessant bei Endlosschleifen)
++ Erstellen des Projekts für den Debugger
Ein C-Projekt unter Eclipse kennt standardmäßig zwei Konfigurationen.
* **Debug**
> Diese Konfiguration wird für den Entwicklungsprozess verwendet und führt Debuginformationen (z. B. Variablennamen) \
in die Ausgabedateien (Objektdateien, Bibliotheken, ausführbare Dateien) des Erstellprozesses mit. _
Diese sind für den Debugger notwendig um das Programm auf Quellcodeebene durchlaufen und geeignet darstellen zu können.
* **Release**
> Diese Konfiguration aktiviert den Optimierungsmodus beim Erstellen der ausführbaren Datei. _
Im resultierenden Programm befinden sich keine Debuginformationen und oft werden auch einige Laufzeitoptimierungen \
beim Erstellen durchgeführt. _
Das daraus resultierende Programm wird als "Release"-Version (Version zur Veröffentlichung) bezeichnet.
Für die weitere Betrachtung des Debuggers wird also angenommen, dass das Projekt in der Debugkonfiguration erstellt wurde. _
Beim Anlegen des Projekts ist diese Konfigurationdie Debug-Konfiguration als Standardkonfiguration voreingestellt.
[[image debug-build.png width="850"]]


++ Starten des Programms im Debugger
Zum Starten des aktuelle Projekt im Debugger wählen Sie zuerst 
* das Projekt im Projekt-Explorer aus //(kann entfallen, wenn nur ein Projekt im Arbeitsbereich bearbeitet wird)// _
und klicken auf die Wanze in der Werkzeugleiste _
> [[image debug-start1.png]]
 _

(alternativ dazu können Sie auch im Menü **Run** -> **Debug** wählen)
> [[image debug-start2.png]]
 _

Sie werden als nächstes gefragt, ob Sie dem Perspektivenwechsel in die Debug-Perspektive zustimmen. _
Bestätigen Sie die Dialogbox mit **Yes**.

++ Debug-Perspektive
Folgende Fensteraufbau finden Sie in der Debug-Perspektive:
[[image debug-perspective.png]]

 _

* **Instanzenbetrachter**
> Hier wird angezeigt wie viele Instanzen des Entwicklungsprojekt (mit und ohne Debugger) gestartet wurden und in welchem Zusatnd diese augenblicklich sind. _
**ACHTUNG:** Solange eine Instanz des Projekts noch läuft wird ein neues Erstellen (//Rebuild//) nicht mehr korrekt abgeschlossen, da die \
ausführbare Datei (EXE-Datei bzw. Linux-Binary) nicht überschrieben werden darf, solange sie noch läuft.

 _

* **Variablenbetrachter**
> Er zeigt den aktuellen Inhalt der lokalen Variablen an.
 _

* **Quellcodebetrachter**
> Dieser Teil zeigt an, wo das Programm angehalten wurde (//grüner Balken//) und ermöglicht das Einsetzen und Entfernen von Haltepunkten.
 _

* **Ausgabefenster**
> Hierin werden die Standardeingabe, -ausgabe und -fehlerausgabe des Projekts umgeleitet. _
**ACHTUNG:** Bei der Umleitung handelt es sich um eine schwerwiegende Schwachstelle von Eclipse, denn sie arbeitet leider nicht richtig. _
Die Ein- bzw. Ausgabe erfolgt nicht synchron zur Abarbeitung des entsprechenden Funktionsaufrufes (z. B. scanf(), printf(), putchar()). _
Unter Windows ist eine Umleitung der Ein-/Ausgabe in ein echtes Konsolenfenster möglich. _
((EclipseRedirect|Hier finden Sie eine Beschreibung zur Umleitung der Ein-/Ausgabe)).
 _

* **(Erweiterte) Werkzeugleiste**
> Die Werkzeugleiste wird in dieser Perspektive um wesentliche Debug-Befehle erweitert. _
Sie können die Befehle auch über den Menüpunkt **Run** auswählen.
> [[image debug-toolbar.png]]

>> (1) **Resume** (Abkürzungstaste: //F8//) _
Wiederaufnahme des Programmlaufs bis zum Ende oder bis zum Auftreten eines Haltepunktes.
 
>> (2) **Terminate** (Abkürzungstaste: //Ctrl-F2//) _
Beenden der Debugsitzung für die aktuelle Instanz.
 
>> (3) **Step Into** (Abkürzungstaste: //F5//) _
Führe die aktuelle Anweisung (//grüner Balken//) aus. Sollte die Anweisung einen Funktionsaufruf darstellen \
dann springe in die Funktion.
 
>> (4) **Step Over** (Abkürzungstaste: //F6//) _
Führe die aktuelle Anweisung (//grüner Balken//) aus. Springe zur nächsten Anweisung des aktuell dargestellten Quellcodes.

++ Einfügen/Entfernen von Haltepunkten
Das Einfügen von Haltepunkten erfolgt entweder durch
Doppelklick links von der entsprechenden Quellcodezeile
> [[image debug-breakpoint1.png]]
oder durch Selektieren der Quellcodezeile und Drücken der Tastenkombination **<Ctrl-Shift-B>**

++ Beenden der Debug-Sitzung
Zum Beenden der Debug-Sitzung beenden Sie zuerst alle noch laufenden (bzw. angehaltenen) Instanzen **(1)** und schalten zurück in die **C/C++-Entwicklungsperspektive (2)**.
[[image debug-end-session.png]]