2016-06-26 61 views
-1

Dies ist ein kleines Programm, das ich den Fehler zu reproduzieren schrieb ich erhalten:C++ Debugger stoppt in falscher Stelle auf Absturz, VS10 win7

#include <assert.h> 
int main(int argc, char **argv) 
{ 
    int* nPtr = 0; 
    *nPtr = 5; 

    //assert(0 && "testing"); 

    //static int nZero = 0; 
    //static float x = 5/nZero; 

    return 0; 
} 

der Call-Stack ist falsch, und es ist jetzt Weg, um die Fehler zurückzuzuverfolgen . im Kompilieren ohne Optimierung in 32 Bit. pdb entspricht der exe.

dies ist der Call-Stack i erhalten:

ntdll.dll!76f615de()  
[Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll] 
ntdll.dll!76f615de()  
ntdll.dll!76f5014e()  
msvcr100d.dll!_unlock(int locknum) Line 375 C 
003df930() 
cccccccc() 

vielen Dank, Evgeny

Antwort

0

ich die Antwort fand ich wurde in here suchen

kurz gesagt, der AVX verursacht einen Fehler in der Aufrufliste nach Ausnahmen.

Sie können AVX tern aus durch:

bcdedit /set xsavedisable 1 

Neustart Ihres Computers

0

Ihr Code ist gebrochen. Ihr Zeiger zeigt nicht auf eine gültige int, wenn Sie durch es schreiben. Das ist undefiniertes Verhalten und Ihr Compiler kann generieren, was immer er will. Dass der Stacktrace im Debugger keinen Sinn macht, ist irrelevant, da es keine Möglichkeit gibt, zu wissen, was zu erwarten ist - so ist die Natur von undefined Verhalten.

+0

Man könnte der Debugger erwarten, dass Sie helfen, den Fehler zu finden und zu beheben ... –

+0

Nun kann der Debugger zeigen Sie nur die Aufruf-Stack, den der Compiler tatsächlich generiert hat (vorausgesetzt, er ist sogar gültig, da der Stack möglicherweise beschädigt ist). Da der Code ein nicht definiertes Verhalten hat, kann der Compiler Unsinn erzeugen und wie könnte der Debugger Ihnen dann helfen? Außer Ihnen zu zeigen, was wirklich passiert ist. –

0

Int * p = 0 , was bedeutet, dass p Punkte 0x00000000, es nicht accessable.so Sie die * p ändern, wird es dazu führen, Pession

verweigert
+0

Nein. Das ist nicht garantiert. Es ist undefiniertes Verhalten (da 'p' ist' nullptr') und * alles * kann passieren - kein Diagnose- oder Laufzeitfehler erforderlich. Der Compiler kann erzeugen, was immer es will (oder überhaupt nicht). –