我的OpenGL的程序会出现一种带有一定随机性的崩溃。提示发生 float deviced by zero 异常。异常代号 0xC000008E。TRACE显示的信息如下First-chance exception in solid2000.exe (KERNEL32.DLL): 0xE06D7363: Microsoft C++ Exception.
Warning: no message line prompt for ID 0xE001.
First-chance exception in solid2000.exe (MAINFRAME.DLL): 0xC000008E: Float Divide by Zero.
First-chance exception in solid2000.exe (OPENGL32.DLL): 0xC000008E: Float Divide by Zero.
崩溃到的代码一般是这样的028D355C   mov         eax,dword ptr [ebp+0Ch] -> 调试器将当前运行点定位在这里
028D355F   mov         ecx,dword ptr [ebp+10h]
028D3562   fld         qword ptr [eax]
028D3564   fsub        qword ptr [ecx]
028D3566   fstp        qword ptr [ebp-18h]但是这样的代码丝毫没有除法的影子。我猜测时前面的代码发生了错误,但是没有表现出来,一直到后面才由于某种原因表现了出来。所以,我想截获这样的异常。当然,我要很精确的截获他,要很精确的定位引发异常的位置。应该如何做呢?

解决方案 »

  1.   

    另外,我尝试了好几台机器,下面的代码居然不发生异常,刚才出现异常的机器上,也无法出现异常 double a, b;
    a = 1;
    b = 0;
    a = a/b;
      

  2.   

    你的程序中使用过opengl错误检测函数(gluError())吗?
      

  3.   

    你是不是去掉了
    Project Setting->C\C++
    Category:C++ Language的Enable Exception Handling 选项啊
      

  4.   

    现在可以获得除零错的异常了,用如下方法打开异常_control87(0, _MCW_EM);
      

  5.   

    to phiger(phiger) :  那个选项还在
      

  6.   

    在浮点格式上存在一个精确的0 __try{
    double a, b;
    a = 1;
    b = 0;
    a = a/b;
    }
    __except(GetExceptionCode() == EXCEPTION_FLT_DIVIDE_BY_ZERO)
    {
    printf("EXCEPTION_FLT_DIVIDE_BY_ZERO");
    }
      

  7.   

    你在调试状态下运行,当发生异常时,应该会有个对话框出来,
    确定后,看看CallStack以及上下相关内容,应该能看到大概在哪条语句出的异常