System.AccessViolationException im Debug, aber nicht im Release Mode
-
Hallo,
ich habe beim Programmieren mit Visual C++ von Microsoft das Problem,
das nach compilieren im Release Modus kein Fehler im Programm auftritt,
während nach dem compilieren des identischen Quellcodes im Debug Mode, bei einem bestimmten Prozess ein System.ViolationException Fehler auftritt.Woran könnte das liegen? Hat da jemand vielleicht eine Idee?
und zwar sieht der Quellcode der Funktion in der der Fehler auftitt so aus:
void paint_closeness(float closeness_knoten[], int n, char bild[], int knotenfeld[1500][1500]) // n ist die Knotenzahl { int height,width; CvScalar s; int i,j,k,faktor; IplImage* imageip = cvLoadImage(bild); // Zu analysierendes Bild IplImage* imageop = cvCreateImage(cvGetSize(imageip),8,1); // Arbeitsbild // war vorher 8,1 IplImage* final = cvCreateImage(cvGetSize(imageip),8,1); // Finales bild imageop = cvCloneImage(imageip); // Klonung des Bildes um damit zu arbeiten height = imageop->height; // Bildhöhe width = imageop->width; // Bildweite float closeness_maximum=0; for (i=0;i<1500;i++) { for (j=i;j<1500;j++) { if (closeness_maximum<closeness_knoten[knotenfeld[i][j]]) {closeness_maximum=closeness_knoten[knotenfeld[i][j]];} } // end for } // end for
In der Zeile des Vergleichs tritt der Fehler auf. Ich vermute das liegt an dem "Knotenfeld" allerdings ist mir der Grund vollkommen unklar, da wie gesagt im Release Mode alles klappt, richtig rechnet und vollkommen korrekt funktioniert.
Ich bin da ratlos
:xmas1:
-
während beim compilieren des identischen Quellcodes im Debug Mode, bei einem bestimmten Prozess ein System.ViolationException Fehler auftritt.
Tritt der Fehler wirklich beim Kompilieren auf? Kann sein, z.B. weil der Windows Forms Designer gewissen Code ausführt für die Darstellung. Eine typische Ursache ist z.B. dass das Working Directory während der Compiletime anders ist als während der Runtime.
Oder tritt die Exception erst auf beim Ausführen des Programms?
-
Wieso benutzt du nicht den Debugger?
-
Der Fehler tritt beim Programm ausführen auf.
Ob Release / Debug Mode, beides compilieren funktioniert.
Nur beim Ausführen im Debug mode gibt es den Crash.
Sorry falls das unklar war.
-
MuhCow schrieb:
Der Fehler tritt beim Programm ausführen auf.
Bashar schrieb:
Wieso benutzt du nicht den Debugger?
-
theta schrieb:
MuhCow schrieb:
Der Fehler tritt beim Programm ausführen auf.
Bashar schrieb:
Wieso benutzt du nicht den Debugger?
Den benutze ich doch. Mir ist trotzdem nicht klar woher der Fehler kommt.
Wieso gibt es einen Fehler während des Ausführens wenn die Projektmappenkonfiguration auf "Debug" steht, und bei der Konfiguration "Release" gibt es den nicht?
Das begreife ich nicht.
-
MuhCow schrieb:
Bashar schrieb:
Wieso benutzt du nicht den Debugger?
Den benutze ich doch.
Und du findest den Fehler trotzdem nicht?
Wieso gibt es einen Fehler während des Ausführens wenn die Projektmappenkonfiguration auf "Debug" steht, und bei der Konfiguration "Release" gibt es den nicht?
Höchstwahrscheinlich hat dein Programm einen Fehler, der im Release zufällig nicht zum Absturz führt. Schlimmer wäre es andersrum, wenn der Fehler nur im Release auftritt (BTDT.)
-
Bashar schrieb:
MuhCow schrieb:
Bashar schrieb:
Wieso benutzt du nicht den Debugger?
Den benutze ich doch.
Und du findest den Fehler trotzdem nicht?
Wieso gibt es einen Fehler während des Ausführens wenn die Projektmappenkonfiguration auf "Debug" steht, und bei der Konfiguration "Release" gibt es den nicht?
Höchstwahrscheinlich hat dein Programm einen Fehler, der im Release zufällig nicht zum Absturz führt. Schlimmer wäre es andersrum, wenn der Fehler nur im Release auftritt (BTDT.)
Nein, ich finde ihn nicht, darum frage ich ja hier leute, die hoffentlich mehr Ahnung haben als ich, also bitte hilf mir.
Worin liegt denn der Unterschied zwischen dem Debug Mode und dem Release Mode, was das Auftreten von dieser Fehlerart betrifft? Das würde vielleicht mein Problem eingrenzen können.
-
MuhCow schrieb:
Nein, ich finde ihn nicht, darum frage ich ja hier leute, die hoffentlich mehr Ahnung haben als ich, also bitte hilf mir.
Was machst du denn mit dem Debugger, dass du den Fehler nicht findest? Bei Access Violations ist das doch ganz einfach: Den Debugger beim Auftritt der Exception stoppen lassen und gucken (sprich Variablenwerte untersuchen), worans gelegen hat.
Worin liegt denn der Unterschied zwischen dem Debug Mode und dem Release Mode, was das Auftreten von dieser Fehlerart betrifft? Das würde vielleicht mein Problem eingrenzen können.
Anderes Speicherlayout, Variablen werden mit bestimmten Werten vorinitialisiert, keine Codeoptimierung usw. Wenn du z.B. im Debug-Modus einen uninitialisierten Zeiger dereferenzierst, gibt es fast sicher einen Absturz. Im Release könnte es sein, dass an der Speicherstelle vorher schonmal ein Zeiger gelegen hat, der irgendwo in deinen Datenbereich zeigt. Dann ist das Programm zwar auch falsch, aber beim Dereferenzieren passiert erstmal nichts, und mit ein bisschen Glück kommt auch am Ende das richtige raus. Bis es dann irgendwann zufällig doch mal nicht mehr klappt und du dir nen Wolf nach dem Fehler suchst.
-
Bashar schrieb:
MuhCow schrieb:
Nein, ich finde ihn nicht, darum frage ich ja hier leute, die hoffentlich mehr Ahnung haben als ich, also bitte hilf mir.
Was machst du denn mit dem Debugger, dass du den Fehler nicht findest? Bei Access Violations ist das doch ganz einfach: Den Debugger beim Auftritt der Exception stoppen lassen und gucken (sprich Variablenwerte untersuchen), worans gelegen hat.
Worin liegt denn der Unterschied zwischen dem Debug Mode und dem Release Mode, was das Auftreten von dieser Fehlerart betrifft? Das würde vielleicht mein Problem eingrenzen können.
Anderes Speicherlayout, Variablen werden mit bestimmten Werten vorinitialisiert, keine Codeoptimierung usw. Wenn du z.B. im Debug-Modus einen uninitialisierten Zeiger dereferenzierst, gibt es fast sicher einen Absturz. Im Release könnte es sein, dass an der Speicherstelle vorher schonmal ein Zeiger gelegen hat, der irgendwo in deinen Datenbereich zeigt. Dann ist das Programm zwar auch falsch, aber beim Dereferenzieren passiert erstmal nichts, und mit ein bisschen Glück kommt auch am Ende das richtige raus. Bis es dann irgendwann zufällig doch mal nicht mehr klappt und du dir nen Wolf nach dem Fehler suchst.
Dankeschön für die Antwort. Mal sehen ob ich den Fehler finde.