2012-03-29 5 views
2

Ich habe einige wirklich seltsame Verhalten mit meinem Code.Debugging-Probleme mit Visual Studio 2010 C++ - Ungerade Werte angezeigt

Es ist eine Zugriffsverletzung Fehler zu werfen, wenn ich es laufen und durch den Debugger kann ich die Linie, um herauszufinden, welche es verursacht:

for(int x=0; x<width; x++) { 

    int current = edgeKernelXY(left+x,top+y,true,0); 
    .... 
} 

ich einen Debug-Punkt in dem Verfahren edgeKernelXY gelegt und der Code ist nie in die Methode gekommen.

Das nächste, was ich überprüfte, war, was die Werte sind, die ich hinein gebe. Links, oben und y scheinen normal genug zu sein. Nach dem Debugger, x = 19840810 und current = 19840810. Ich verstehe nicht, wie das passiert sein könnte, besonders wenn ich am Anfang der Schleife x zu 0 erklärt. Breite ist korrekt bei 40.

x und current wurden nirgendwo anders im Umfang der Forloop deklariert. Was könnte hier schiefgehen?

EDIT:

ich den Code wie folgt verändert:

for(int x=0; x<width; x++) { 
     int current = edgeKernelXY(left,top+y,true,0); 
     if(current > THRESHOLD && 
      edgeKernelXY(left+x,top+y,true,1) > THRESHOLD && 
      edgeKernelXY(left+x,top+y,true,2) > THRESHOLD) { 
     } else { 
      current = 0.0f; 
     } 

Insbesondere änderte ich links + x auf dem ersten Aufruf von edgeKernelXY nur links. Dies scheint zu laufen und der zweite Aufruf von edgeKernelXY zeigt x korrekt auf 0 gesetzt. Allerdings ist das Verhalten nicht das was ich will. Links + x bringt mir immer noch verrückte Werte für x, die eine Zugriffsverletzung verursachen.

for(int x=0; x<width; x++) { 

     int current; 
     current = 0; 
     current = edgeKernelXY(left+x,top+y,true,0); 

Zeigt auch Probleme mit Strom.

+2

Es ist keine Überraschung, dass "aktuell" falsch ist, da es zu diesem Zeitpunkt noch nicht zugewiesen wurde. Meine einzige Vermutung für "x" ist, dass ein Teil des Codes, den Sie herausgeschnitten oder sonst nicht angezeigt haben, UB ist, da dies für mich gut aussieht. –

+0

Überprüfen Sie oben, der Code wird kopiert und direkt ohne Zeilen dazwischen eingefügt. – Jkh2

+2

Debuggen Sie einen Release-Build? Das könnte dazu führen, dass der Debugger sehr seltsame Werte für Locals zeigt und niemals einen Breakpoint trifft, der auf 'edgeKernelXY()' gesetzt ist. Was wird ausgegeben, wenn Sie ein 'printf ("% d \ n ", x)' (oder ein ähnliches 'OutputDebugString()') eingeben? Ich wette, es zeigt den richtigen Wert für 'x', auch wenn der Debugger nicht. –

Antwort

3

Da Sie einen Release-Build debuggen, können Sie nicht darauf vertrauen, dass der Debugger die richtigen Werte in Überwachungsfenstern usw. anzeigt.Debugging-Release-Modus kann getan werden, ist aber wesentlich schwieriger. Im Allgemeinen ist es erforderlich, die Demontage zu betrachten, um zu verstehen, was passiert und was der Stand der Dinge ist (dh x wird fast sicher in einem Register geführt).

Wenn Sie keine vollständige Debug-Version ausführen können, können Sie dennoch eine wesentlich bessere Debugging-Erfahrung erzielen, wenn Optimierungen deaktiviert sind (dies kann in Release-Builds erfolgen und ohne Verknüpfung mit Debug-Bibliotheken erfolgen).

Angenommen, Sie erstellen in der IDE, gehen Sie einfach in die Projekteinstellungen und ändern Sie den Wert C/C++ - Optimization - Optimization in Disabled (/Od).

Wenn dies ein Problem verursacht, indem Sie es projektweit festlegen (was nicht der Fall sein sollte), können Sie das selbe per Quelltext machen, indem Sie mit der rechten Maustaste auf die Quelldateien klicken, die Sie interessieren Festlegen der Option in den Eigenschaften für diese Quelldatei. Denken Sie daran, diese Einstellungen zu löschen, wenn Sie fertig sind (und sie nicht in die Quellcodeverwaltung einchecken), da die IDE nicht dafür sorgt, dass bestimmte Einstellungen für die Quelldatei vorhanden sind, so dass es im weiteren Verlauf verwirrend sein kann.

0

Nur wenige Dinge

  1. Gibt es doppelt Löschungen in Ihrem Programm zu überprüfen, die den Haufen vermasselt könnten (ich weiß, es ist nicht die Frage der x auf dem Stapel nicht erklären, aber etwas zu überprüfen trotzdem)
  2. Gibt es irgendwelche Aussagen zwischen dem for Starten des Funktionsaufrufs edgeKernelXY? Wenn ja, bitte die für jeden potenziellen Stack-Überlauf überprüfen
  3. Der Wert x falsch ist mir riecht wie Stapelbeschädigung, die
    • aufgrund mehrerer Gründe passieren kann, ist es ein Array, das Sie am Anfang des Geschaffenen Funktion, die den Stapel überrannt?
    • Könnte es einen Funktionsaufruf sein, der einen Zeiger auf ein Array zurück (auf dem Stapel), die Sie unter der Annahme verwenden, dass die Daten bereits

Alle oben nicht geben Ihnen verfügbar sind genaue Antwort, die Sie suchen, aber einige Optionen für Sie zu überprüfen. Und am wichtigsten - haben Sie Ihr Programm durch einen Speicherprofiler (wie Valgrind) laufen lassen und die Ausgabe überprüft? Meistens zeigt das die Ursache dieses Problems.

Wenn Sie die Ursache für das Problem herausfinden, posten Sie bitte den von Ihnen verfolgten Ansatz. Es wird die Erfahrung der Gemeinschaft reicher machen. Vielen Dank.

+0

Stack Korruption ist ein guter Gedanke, das würde es erklären –