c - Win32 "C"未处理的异常在错误的位置中断

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

这几天一直困扰着我!

我们有一个应用程序遇到了被零除的问题。该应用程序是专门为在这种情况下引发异常而构建的,通过调用 _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 上运行时出现相同的奇怪行为。

提前致谢。

最佳答案

哇!

将这篇文章展示给一位 friend 之后...他发现了一份英特尔文档,其中显示了与他们的某些 CPU 非常相似的症状...然后我在此处找到了适用于我们特定 CPU(英特尔 i5-2500)的确切文档:

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

参见勘误表 BJ1

这几乎准确地描述了我遇到的情况!我从来没有(认真地)认为这会是那个级别的问题!

关于c - Win32 "C"未处理的异常在错误的位置中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13479746/

相关文章:

c++ - 如何使用 CreateFile 在 UnBuffered 模式下在 Windows 中追加文件

c - 浮点精度与实际分配的值不匹配?

c++ - 不确定如何装饰我的 C++ 库代码以在 C 中使用

c - OpenMP 与节的嵌套并行性

c++ - memcpy 中的指针运算有奇怪的结果

c++ - 默认按钮只工作一次

c - 再次 float

c++ - ChangeDisplaySettingsEx() 总是返回 DISP_CHANGE_BADPARAM

c - 将 %u 说明符与浮点变量一起使用时出现意外输出?

java - 如何获得架构支持的最小的 next 或 previous 可能的 double 值?