Probleme beim Release-Mode unter MSVS 2003
-
Hallo Miteinander,
ich habe gerade eine erstaunliche Entdeckung gemacht. Ich arbeite mit MSVS 2003.net, von dem nur das C++ Modul installiert ist, unter Windows XP Home. Bisher habe ich alle programme immer im Debug-Modus kompiliert und eigentlich versucht "sauber" zu programmieren (also auch Warnungen, und nicht nur Fehler zu beseitigen). Beim Versuch meine Kenntnisse über VS zu erweitern habe ich jetzt ausprobiert, worin der unterschied zwischen debug und release ist und festgestellt, dass bei der kompilierung deutlich schlankere Programme entstehen. (Ist ja irgendwo einleuchtend)
Nun zum meinem Problem: Einige meiner programme die im Debug modus ohne Fehler und Warnungen compilieren und fehlerfrei laufen, compilieren im release mode, aber stürzen unmittelbar nach dem start mit irgendwelchen Zugriffsverletzungen ab. Bei der Suche nach den Ursachen habe ich dann festgestellt, dass wenn ich beim Absturz in den Debug-modus gehe der Calling Stack leer ist.
Wie kann ich vorgehen um die Fehlerquellen zu lokalisieren? (Manche Programme sind doch relativ umfangreich)
An was könnte es noch liegen? :am verzweifeln bin:
Bin um jede Hilfe sehr, sehr, sehr dankbar
Danke allerseits
MFG
-
Also im Debug wird unitialisierter Speicher auf 'CC' gesetzt.
Im Release ist er dann wirklich unvorhersehbar.Eine Pseudo-Debug Methode, die ich in solchen Fällen gerne nehme:
[c++]
MessageBox(NULL, "Funktionsname", "Huhu", MB_OK);
[/c++]Die klemmst du vor jeden Funktionsaufruf, der in Frage kommt.
So kannst du das Problem rasterfahnden.
-
Du wirst wahrscheinlich auf eine Null-Pointer zugreifen oder auf Pointer die in das Nirvana zeigen. Ein Bsp. wäre, das du sowas machst:
A *p; foo(p); voif foo(A *p) { if(p==null) return; p->bla; }
So, was passier im Debug? Im Debug macht dir dein Compiler autom. p = NULL. D.h. dein p würde bei der if-Abfrage korrekt beanstandet werden. Im Release jedoch, wird p in das Nirvana zeigen (also eine Adresse die garnicht stimmt). Weil du vergessen hast es selbst mit NULL zu initialisieren, was bisher das Debugger-Compilat gemacht hat.
Also, das ist so ein Beispiel wo es Release- und Debug-Unterschiede gibt. Ich habe mir deshalb angewöhnt meine Pointer immer zu initialisieren, mind. mit NULL. Dann gibts im Release eine Überraschung weniger.
-
Hallo miteinander,
herzlichen Dank für eure Hilfe. Das Problem waren genau ein nicht initialisierter Zeiger den ich mit dem MessageBox(...);-en eingrenzen konnte.
Schade eigentlich, dass der Debug-Modus diese dann selbst mit NULL initialisiert und keine Warnung ausgibt. Oder?
Jedenfalls, nochmals herzlichen Dank.
Bis dann
-
Du kannst auch eine Release-EXE debuggen...
Siehe auch:
http://www.codeproject.com/debug/survivereleasever.asp
-
@Jochen Kalmbach: Danke für den Link zu dem Tollen Aufsatz...
Jetzt wird mir so manches klar...