最近几天这让我感到困惑!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上运行时出现同样的奇怪行为。
在此先感谢。
许多这些条件不是马上被发现的,而是在某些操作发现它处于不良状态时发生的。这种行为很可能是CPU特定的。 –
另外请注意,在绝望中,我已经卸载/重新安装了与Visual Studio相关的所有内容。当然,结果相同。 – ThermoX
问题是......这个突破对于我测试过的每一台机器(赢得7 x64,赢得服务器2008 R2,XP)和各种CPU都完美无缺......并且它总是按预期工作。这段代码非常古老,一直在运行。我认为这可能是在计算机BIOS或东西...某些MB/CPU机器特定的优化,搞砸了处理...但我仍然得到相同的结果时,关闭除1个CPU和所有优化设置通过BIOS。 – ThermoX