这几天一直困扰着我!
我们有一个应用程序,我们正在运行被零除。该应用程序是专门为在这种情况下引发异常而构建的,通过调用 _controlfp_s 函数来更改浮点异常的掩码。
现在,当在我们几乎所有的机器上运行被零除时,Visual Studio 2005 调试器会在我们的源文件中的适当位置中断。但是,在 1 台机器上,中断位置遍布各处,似乎与中断的实际原因无关。因此,作为测试,我只用以下几行代码构建了一个简单的 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)\Microsoft Visual Studio 8\VC\crt\src\tidtable.c
功能:
__set_flsgetvalue()
在我逐步执行汇编代码时查看寄存器,一切看起来都很好,直到我点击“fstp”指令......然后所有寄存器似乎都搞砸了(与在一台好的机器上看起来一样)。在比较好与坏的堆栈时,我还看到坏机器上的堆栈条目,而我在好机器上看不到......
我在这里跳过了很多细节,以试图缩短第一次通过的时间......但如果有人愿意提供帮助,我会加起来更多。
注意:操作系统 Win7 x64,运行所有最新的 VS2005 服务包。与运行相同软件和服务包的类似(工作)机器相比。在 VS2010 上运行时出现同样奇怪的行为。
提前致谢。