1

最近几天这让我感到困惑!Win32“C”未处理的异常在错误位置中断

我们有一个应用程序,我们正在运行一个除零。该应用程序专门用于在这种情况下引发异常,并调用_controlfp_s函数更改浮点异常的掩码。

现在,当我们在几乎所有的机器上运行到0分频时,Visual Studio 2005调试器会在源文件中的适当位置中断。然而,在一台机器上,破损位置遍布整个地方,似乎与破裂的真正原因无关。因此,作为一个测试,我建立了一个简单的C Win32程序只用下面的代码行:

int main(int argc, char *argv[]) 
{ 
    float temp1, temp2, temp3; 
    unsigned int control; 

    _controlfp_s(&control, (_EM_UNDERFLOW + _EM_INEXACT, _MCW_EM); 

    temp1=1.0; 
    temp2=0.0; 
    temp3=temp1/temp2; 

    return 0; 
} 

在所有这些“好”的机器,代码没有打破在TEMP3。然而,坏机上,在码符:

C:\ Program Files文件(x86)的\微软的Visual Studio 8 \ VC \ CRT \ SRC \ tidtable.c

功能:

__set_flsgetvalue ()

查看寄存器,当我逐步通过汇编代码时,一切看起来都很好,直到我点击“fstp”指令......然后所有的寄存器似乎都被搞乱了(看起来和预期的一样, )。当比较好的和坏的堆栈时,我也看到坏的机器上堆栈条目,我没有看到好的堆栈条目...

我在这里跳过了很多细节,试图保持这个第一遍短,但如果有人如此善良以帮助,我会加起来。

备注: OS Win7 x64,运行所有最新的VS2005服务包。与运行相同软件和服务包的类似(工作)机器相比。在VS2010上运行时出现同样的奇怪行为。

在此先感谢。

+0

许多这些条件不是马上被发现的,而是在某些操作发现它处于不良状态时发生的。这种行为很可能是CPU特定的。 –

+0

另外请注意,在绝望中,我已经卸载/重新安装了与Visual Studio相关的所有内容。当然,结果相同。 – ThermoX

+0

问题是......这个突破对于我测试过的每一台机器(赢得7 x64,赢得服务器2008 R2,XP)和各种CPU都完美无缺......并且它总是按预期工作。这段代码非常古老,一直在运行。我认为这可能是在计算机BIOS或东西...某些MB/CPU机器特定的优化,搞砸了处理...但我仍然得到相同的结果时,关闭除1个CPU和所有优化设置通过BIOS。 – ThermoX

回答