Forum: PC-Programmierung debuggen in Codeblocks klemmt


von Matthias W. (matt007)


Lesenswert?

Codeblocks 13.12 incl. Ming ist neu installiert. Ein C-File mit 
Anweisungen für Dateioperationen wurde geladen. Build arbeitet. Unten 
erscheint eine kurze Meldung "Process terminated with status 0. 0 
errors, 0 warnings. Bei Run läuft das Programm auch.

Um die Fehler zu entfernen muss ich debuggen. In Zeile 73 ist eine 
print-Anweisung. Darauf habe ich einen Breakpoint gesetzt. Nur leider 
hält das Programm dort nicht an. Was mache ich falsch?

: Verschoben durch User
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Möglicherweise beendet sich das Programm, bevor es zu Zeile 73 kommt.

Setz mal einen Breakpoint auf die erste Anweisung innerhalb von main().

von Dumdi D. (dumdidum)


Lesenswert?

Auch mal ohne Optimierung kompilieren.

von Matthias W. (matt007)


Lesenswert?

Rufus Τ. F. schrieb:
> Möglicherweise beendet sich das Programm, bevor es zu Zeile 73 kommt.

guter Hinweis. So kann es nicht sein, denn Zeile 73 ist die erste Zeile 
wo etwas gemacht wird - die Anzeige des Programm-Namens.

> Setz mal einen Breakpoint auf die erste Anweisung innerhalb von main().

genau das ist ja die erste Anweisung innerhalb main. Davor sind nur 
Zuweisungen von Variablen.

von Matthias W. (matt007)


Lesenswert?

Dumdi D. schrieb:
> Auch mal ohne Optimierung kompilieren.

unter dem Menüpunkt "Settings compiler" compiler flags ist eine größere 
Liste möglicher Einträge. Angehakt ist da momentan nichts. Was sollte da 
ggf. angehakt werden?

"Produce debugging symbols"?
"enable all common compiler warnings"?

keinerlei Optimierungen sind angeklickt.
auch ein bestimmter Prozessor ist nicht vorgegeben.

vermutlich muss noch etwas konfiguriert werden?

muss ein Projekt eingerichtet werden oder reicht es ein file einzuhängen 
so wie ich es getan habe?

von Rainer V. (rudi994)


Lesenswert?

http://wiki.codeblocks.org/index.php?title=Debugging_with_Code::Blocks

CodeBlocks Debugger: Programm bzw. C/Cpp-Quellcode als Projekt anlegen, 
dort werden dann einige Ordner für Debug-Infos erzeugt. Beim Anlegen des 
Projektes erscheint ein Dialog mit Optionen "Debug" und "Release" (beide 
defaultmäßig aktiviert).

Spätere Einstellungen im Projekt: Menu "Project\Build Options" wählen, 
weiter im Dialog "Project Build Options", im Feld "Selected compiler" 
den richtigen Compiler wählen (hier: GNU GCC Compiler).

Kartenreiter "Compiler settings", dann "Compiler flags" und dort folg. 
Optionen anpassen:
- "Produce debugging symbols [-g]" muß aktiviert sein!
- "Enable all compiler warnings ... [-Wall]" evtl. aktivieren.
- "Strip all symbols from binary ... [-s]" muß deaktiviert sein!

Dialog mit "OK" schließen. In Menü "Debug" den "Active Debugger" und die 
gewünschten "Debugging windows" zur Informationsanzeige wählen.

Projekt mit Menu "Build\Rebuild" vollständig neu compilieren, damit die 
Einstellungen auch zum Debuggen in das Projekt übernommen werden. Danach 
in Menü "Debug" starten usw.

von Matthias W. (matt007)


Lesenswert?

wenn der Compiler keine debug-Infos erzeugt kann auch der Debugger nicht 
funktionieren. Scheinbar ist hier nichts brauchbar defaultmäßig 
konfiguriert?

von Matthias W. (matt007)


Lesenswert?


von Rainer V. (rudi994)


Lesenswert?

Noch vergessen: vor Start des Debuggers gewünschte Breakpoints setzen!

Debugging geht wohl nur in einem Projekt. Bei einfachem Quelltext (kein 
Projekt) kann man zwar im Menü "Settings\Compiler" die Optionen -g und 
-s einstellen, aber die zum Debuggen relevanten Menüpunkte in anderen 
Menüs sind ausgegraut.

von Matthias W. (matt007)


Lesenswert?

Rainer V. schrieb:
> CodeBlocks Debugger: Programm bzw. C/Cpp-Quellcode als Projekt anlegen,
> dort werden dann einige Ordner für Debug-Infos erzeugt. Beim Anlegen des
> Projektes erscheint ein Dialog mit Optionen "Debug" und "Release" (beide
> defaultmäßig aktiviert).

vielen Dank Rainer !

> Spätere Einstellungen im Projekt: Menu "Project\Build Options" wählen,
> weiter im Dialog "Project Build Options", im Feld "Selected compiler"
> den richtigen Compiler wählen (hier: GNU GCC Compiler).

habe ich gemacht.

> Kartenreiter "Compiler settings", dann "Compiler flags" und dort folg.
> Optionen anpassen:
> - "Produce debugging symbols [-g]" muß aktiviert sein!
> - "Enable all compiler warnings ... [-Wall]" evtl. aktivieren.
> - "Strip all symbols from binary ... [-s]" muß deaktiviert sein!

auch gemacht.

> In Menü "Debug" den "Active Debugger"

hier steht entweder
+ Targets default oder
+ GDB/CDB debugger default.

Soll ich das untere wählen? Bisher ist das obere aktiv.

> gewünschten "Debugging windows" zur Informationsanzeige wählen.

ok.

> Projekt mit Menu "Build\Rebuild" vollständig neu compilieren, damit die
> Einstellungen auch zum Debuggen in das Projekt übernommen werden. Danach
> in Menü "Debug" starten usw.

vielen Dank Rainer. Nun geht es !

von Rainer V. (rudi994)


Lesenswert?

Matthias W. schrieb:
> + Targets default oder
> + GDB/CDB debugger default.
>
> Soll ich das untere wählen?

Weiß ich auch nicht genau, mögl.weise ist Targets default dasgleiche wie 
die Debugger GNU GDB und MS(R) CDB, solange der Benutzer keinen anderen 
Debugger installiert und über folg. Weg eingetragen hat:

Menu Settings\Compiler, weiter im Dialog Global Compiler Settings unter 
Kartenreiter Toolchain executables, weiter unter Program Files und dann 
im Eingabefeld Debugger. Hier ist nach der Installation von CodeBlocks 
defaultmäßig der GDB/CDB Debugger eingetragen.

von Matthias W. (matt007)


Lesenswert?

Danke Rainer !
Dank Deiner Hilfe habe ich das C-Programm nun endlich zum Laufen 
gebracht.

Ein lästiger Punkt war dabei daß ich zeilenweise in eine Datei schreibe 
und das auch gerne kontrollieren wollte.

Leider hat das nicht geklappt. Nach dem Schreiben einer Zeile schien die 
Datei leer zu sein. Erst nachdem alles drin war und die Datei 
geschlossen wurde war der Inhalt korrekt zu sehen.

So ein Verhalten erschwert die Fehlersuche. Gibts dazu vielleicht eine 
Idee für das nächste Mal?

von Flo (Gast)


Lesenswert?

Das Verhalten ist so gewollt und dokumentiert. Man nennt das "Puffern".

Wenn du unbedingt darauf angewiesen bist, daß nach einem Schreibzugriff 
tatsächlich sofort etwas in der Datei steht, dann mußt du "flush" 
aufrufen.

von Matthias W. (matt007)


Lesenswert?

Flo schrieb:
> Das Verhalten ist so gewollt und dokumentiert. Man nennt das "Puffern".

vielen Dank Flo. Ich dachte mir schon daß es da einen Cache gibt.

> Wenn du unbedingt darauf angewiesen bist, daß nach einem Schreibzugriff
> tatsächlich sofort etwas in der Datei steht, dann mußt du "flush"
> aufrufen.

kann man den Debugger so konfigurieren daß dieser das im Single-Step 
Betrieb sinnvollerweise selbst macht?

Wo kann ich das "flush" denn aufrufen?
Sollte ich dazu eine Zeile in die C-Datei schreiben die das dann 
automatisch für Debug-Zwecke macht?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Der Debugger hat damit nichts zu tun, das muss Dein Programm schon 
selbst tun.

Das tut Dein Programm dann aber auch, wenn es nicht im Debugger läuft, 
aber dafür gibt es ja die Unterscheidung zwischen Debug- und 
Release-Build, und Du kannst den flush-Aufruf per bedingter Compilation 
nur im Debug-Build ausführen.

Das sieht dann in etwa so aus:
#ifdef DEBUG
  fflush(datei);
#endif

von Matthias W. (matt007)


Lesenswert?

Rufus Τ. F. schrieb:
> #ifdef DEBUG
>   fflush(datei);
> #endif

Vielen Dank Rufus. Dann sollte ich das also in den Quellcode hinter dem 
Schreibbefehl einbauen. Das Flag setzt dann offenbar die Umgebung, falls 
der Debug-Mode gewählt ist. Ist es so?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Matthias W. schrieb:
> Das Flag setzt dann offenbar die Umgebung, falls der Debug-Mode gewählt
> ist.

Die üblichen Compiler handhaben das so; ob das bei Deinem der Fall ist, 
wirst Du der Dokumentation entnehmen müssen -- oder einfach 
ausprobieren.

Nochmal: Das ist etwas, was der Compiler macht, es hat nichts damit zu 
tun, wie Du das fertige Programm ausführst, ob Du es unter Kontrolle 
eines Debuggers laufen lässt oder nicht.

von Matthias W. (matt007)


Lesenswert?

Rufus Τ. F. schrieb:
> Die üblichen Compiler handhaben das so; ob das bei Deinem der Fall ist,
> wirst Du der Dokumentation entnehmen müssen -- oder einfach
> ausprobieren.

meiner ist eben "Codeblocks 13.12 incl. Ming". Also Gcc.

> Nochmal: Das ist etwas, was der Compiler macht, es hat nichts damit zu
> tun, wie Du das fertige Programm ausführst, ob Du es unter Kontrolle
> eines Debuggers laufen lässt oder nicht.

klar. Es ist die Frage ob dieses Flag dann korrekt gesetzt wird beim 
Erstellen von Code fürs Debuggen und wieder rückgesetzt beim normalen 
Programm. Das ist testbar.

von Rainer V. (rudi994)


Lesenswert?

Symbol DEBUG wird bei mir in CodeBlocks 13.12 nicht automat. generiert 
und offenbar auch nichts ähnliches, wie _DEBUG, __DEBUG usw. Habe es 
dann wie folgt manuell veranlaßt:

Menü Project\Build options, dann im Dialog "Project Build options" links 
unter "Projektname, Debug, Release" den Unterpunkt "Debug" wählen, unter 
Kartenreiter Compiler settings den Kartenreiter #defines wählen und dann 
darunter im Eingabefeld das Wort DEBUG eintragen.

Jetzt sollte das in o.g. Weise definierte Symbol nur beim Debugging bzw. 
für die Debug-Version des Programms gelten. Dem ist aber leider nicht 
so. Stattdessen ist ein unter Debug\...\#defines eingetragenes Symbol 
bzw. die bedingte Compilierung immer wirksam in den Fällen Build, 
Rebuild, Build and Run, beim Debugging der Debug-Programmversion wie 
auch in der mit Build erzeugten Release-Version. Dagegen bleibt ein 
unter Release\...\#defines eingetragenes Symbol immer unwirksam (wird 
gar nicht definiert).

Wie ist das zu verstehen? Fehlbedienung, Bug oder Feature?

von Matthias W. (matt007)


Lesenswert?

Rainer V. schrieb:
> Wie ist das zu verstehen? Fehlbedienung, Bug oder Feature?

vielen Dank Rainer für den Test !

Natürlich kann man das auch manuell selbst machen, indem man
einfach im Quelltext oben das define hineinschreibt.
Wenn man debuggt so schaltet man das define ein.
Wenn man fertig ist damit - so schaltet man wieder ab.

Auf dieselbe Weise kann man auch weitere Testausgaben für
das Debuggen aktivieren und danach wieder loswerden.

Natürlich wäre es eleganter gewesen wenn das Tool hier eine
einfache Unterstützung ermöglicht hätte. Bevor man dann lange
in Menüs herumsuchen muss ist der Weg im Quellcode vermutlich
der Bessere.

von Rainer V. (rudi994)


Lesenswert?

Umständliches Hantieren mit #define DEBUG im Quelltext ist nicht im 
Sinne des Benutzers und würde alleine auch nichts nützen. Habe gesehen, 
daß vor Build bzw. Rebuild und auch später vor dem Laufenlassen oder 
Debuggen des Programms noch im Menü Build\Select Target entweder Debug 
oder Release einzustellen ist. Dann klappt es auch mit dem richtigen 
Einbinden der in o.g. Weise manuell definierten Symbole. Auch werden die 
Projekt-Unterordner Debug und Release und betreffende Programmversionen 
immer nur entsprechend dieser Target-Einstellung erzeugt.

von Matthias W. (matt007)


Lesenswert?

Danke für den Hinweis Rainer !

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.