Win32“C”未处理的异常在错误的位置中断

时间:2012-11-20 18:29:03

标签: c winapi floating-point visual-studio-debugging unhandled-exception

过去几天这让我很困惑!

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

现在,当我们在几乎所有的机器上运行时都是零除之外,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)\ Microsoft Visual Studio 8 \ VC \ crt \ src \ tidtable.c

功能:

__ set_flsgetvalue()

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

我在这里跳过了一些细节,试图保持第一次通过的简短......但如果有人善于帮助我,我会加起来更多。

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

提前致谢。

1 个答案:

答案 0 :(得分:1)

哇!

在向朋友展示这篇文章之后......他发现一个英特尔文档显示了一些关于他们的cpu的非常相似的症状......然后我找到了适用于我们特定CPU(intel i5-2500)的确切文档:

http://www.intel.com/content/dam/www/public/us/en/documents/specification-updates/2nd-gen-core-deskt ...

见勘误表BJ1

这几乎准确地描述了我遇到的情况!我从未(认真)认为这将是一个问题!