Bei Debug Fehler bei Release gehts
-
In meinen OnInitDialog stürzt das Prog immer im Debug ab, aber im Release geht es.
Programm stürzt immer bei UpdateData(TRUE); ab.Danke.
-
Ich vermute, das ist kein Absturz sondern ein ASSERT.
Das dürfte in DoDataExchange passieren. Guck mal, ob alle Dialogelemente da drin noch okay sind und ob das UpdateData NACH CDialog::OnInitDialog durchgeführt wird.
-
Ich hatte CDialog::OnInitDialog vergessen.
Aber wiso geht es dann beim Release?
-
Gute Frage, keine Ahnung - ist eigentlich unlogisch...
Naja, Hauptsache es geht jetzt.
-
Ein ASSERT wird in der Releaseversion wegoptimiert. D.h. es gibt dann auch keine Fehlermeldung an der Stelle. Im allgemeinen knallt's dann etwas später - vielleicht aber erst auch beim Kunden...
ASSERTs helfen, in der Debugversion Stellen zu finden, an denen eine Variabele einen anderen Wert hat, als angenommen. Es empfiehlt sich auch, selbst nicht mit ASSERTs zu geizen wenn man an einer Programmstelle bestimmte Bedingungen voraussetzt. In der Releaseversion bleibt davon dann auch nichts mehr übrig.Und noch etwas: ASSERTs dienen nicht zum Fehlerhandling, also z.B. um falsche Benutzereingaben abzufangen.
-
Kleine Ergänzung zum ASSERT:
Die sind auch enorm praktisch als Erinnerung. Ich mache gerne
ASSERT(FALSE); // Todo: Das und das noch einbauen...
an Stellen, wo mir Teile fehlen, die ich noch nachholen muss.
Denn oft habe ich vergessen, DASS da überhaupt noch was fehlt und wundere mich erstmal, bis ich den Kommentar lese.ASSERTs werden in Büchern leider nie als Hilfsmittel erwähnt. Dabei sind sie so praktisch...
-
Weitere Unterschiede zwischen Release und Debugversion:
- unref. Pointer werden auf Null gesetzt.
- um Arrays werden Sicherheitbereiche gelegt.Ist beides natürlich toll um Fehler zu finden, die durch solche
Nullpointer und Bereichsüberschreitungen verursacht werden.
-
Nee - das stimmt nicht.
Uninitialisierte Zeiger werden in C++ nicht automatisch mit NULL belegt, nicht in der Release und nicht in der Debug-Version. (zumindest in VC6)
Es ist aber so, dass die Debugversion "poröser" ist, also mit viel mehr Lücken im Codebereich. Deshalb kann es sein, dass ein uninitialisierter Zeiger in der Debug-Version mit größerer Wahrscheinlichkeit zufällig NULL ist.In der Debugversion gibt's auch keine Sicherheitsbereiche um Arrays um z.B. Array-Überschreitungen zu erkennen. Wegen der Lücken ist es sogar so, dass in der Debug-Version eine Array-Überschreitung nicht so schnell zu einem Abstürz führt.
Außerdem wird angelegter Speicher mit 0xCD-Bytes gefüllt (um uninitialisierten Speicher zu erkennen) und es werden zusätzliche Informationen zum Feststellen von Memory-Leaks abgelegt.
-
Vielen Dank an alle.
Bin jetzt wieder etwas schlauer