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
Möglicherweise beendet sich das Programm, bevor es zu Zeile 73 kommt. Setz mal einen Breakpoint auf die erste Anweisung innerhalb von main().
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.
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?
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.
wenn der Compiler keine debug-Infos erzeugt kann auch der Debugger nicht funktionieren. Scheinbar ist hier nichts brauchbar defaultmäßig konfiguriert?
Rainer V. schrieb: > http://wiki.codeblocks.org/index.php?title=Debugging_with_Code::Blocks Vielen Dank Rainer !
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.
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 !
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.
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?
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.
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?
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
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?
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.
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.
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?
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.