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

C Win32“;";未处理的异常在错误位置中断,c,winapi,floating-point,visual-studio-debugging,unhandled-exception,C,Winapi,Floating Point,Visual Studio Debugging,Unhandled Exception,这几天来一直困扰着我 我们有一个应用程序,在这个应用程序中,我们遇到了一个被零除的问题。该应用程序是专门为在这种情况下引发异常而构建的,通过调用_controlfp_函数来更改浮点异常的掩码 现在,当在几乎所有的机器上都遇到除法为零时,VisualStudio2005调试器会在源文件中的适当位置中断。但是,在1台机器上,断裂位置到处都是,似乎与断裂的实际原因无关。作为测试,我用以下代码行构建了一个简单的C win32程序: int main(int argc, char *argv[]) {

这几天来一直困扰着我

我们有一个应用程序,在这个应用程序中,我们遇到了一个被零除的问题。该应用程序是专门为在这种情况下引发异常而构建的,通过调用_controlfp_函数来更改浮点异常的掩码

现在,当在几乎所有的机器上都遇到除法为零时,VisualStudio2005调试器会在源文件中的适当位置中断。但是,在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:\ProgramFiles(x86)\Microsoft Visual Studio 8\VC\crt\src\tidtable.C

功能:

__set_flsgetvalue()

在我逐步完成汇编代码时查看寄存器,在我点击“fstp”指令之前,一切看起来都很好。。。然后所有的寄存器看起来都乱七八糟(而不是在一台好机器上看起来像预期的那样)。当比较好和坏机器上的堆栈时,我还看到坏机器上的堆栈条目,而好机器上没有看到

我在这里跳过了很多细节,试图缩短第一关。。。但如果有人愿意帮忙,我会加上更多

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

提前谢谢。

将此帖子展示给朋友后。。。他发现了一份英特尔文件,其中显示了与他们的一些cpu非常相似的症状。。。然后,我在这里找到了适用于特定CPU(英特尔i5-2500)的确切文档:

见勘误表BJ1

这几乎完全描述了我遇到的情况!我从来没有(认真地)想过这将是一个问题,在这个水平

将此帖子展示给朋友后。。。他发现了一份英特尔文件,其中显示了与他们的一些cpu非常相似的症状。。。然后,我在这里找到了适用于特定CPU(英特尔i5-2500)的确切文档:

见勘误表BJ1


这几乎完全描述了我遇到的情况!我从来没有(认真地)想过这将是一个问题,在这个水平

这些情况中的许多不是立即检测到的,而是在某些操作发现其处于不良状态后很久检测到的。这种行为很可能是特定于CPU的。还请注意,在完全绝望的情况下,我卸载/重新安装了与Visual Studio相关的所有内容。当然,结果是一样的。问题是。。。在我测试过的每台机器上(Win7x64,WinServer2008R2,XP)都有不同的CPU,这种中断工作得非常好。。。而且它总是像预期的那样工作。这段代码非常古老,一直有效。我想可能是电脑BIOS里的什么东西或者什么。。。某些MB/CPU特定于机器的优化会导致处理混乱。。。但是,当我通过BIOS关闭除1个cpu之外的所有cpu和所有优化设置时,我仍然得到了相同的结果。而且,我相信如果应用程序没有特别调用。。。此时,某些代码可能会对某些错误的浮点值做出意外反应。。。但是当特别调用_controlfp_s时,我相信这会在检测异常时强制抛出异常。。。正如在所有好机器上单步执行汇编代码时所看到的那样。道格(因为你是唯一一个尝试过的人)。。。我想你会对我的附加测试结果感兴趣的。我已经采取了以下故障排除步骤:这些情况中的许多不是立即检测到的,而是在某些操作发现其处于不良状态后不久检测到的。这种行为很可能是特定于CPU的。还请注意,在完全绝望的情况下,我卸载/重新安装了与Visual Studio相关的所有内容。当然,结果是一样的。问题是。。。在我测试过的每台机器上(Win7x64,WinServer2008R2,XP)都有不同的CPU,这种中断工作得非常好。。。而且它总是像预期的那样工作。这段代码非常古老,一直有效。我想可能是电脑BIOS里的什么东西或者什么。。。某些MB/CPU特定于机器的优化会导致处理混乱。。。但是,当我通过BIOS关闭除1个cpu之外的所有cpu和所有优化设置时,我仍然得到了相同的结果。而且,我相信如果应用程序没有特别调用。。。此时,某些代码可能会对某些错误的浮点值做出意外反应。。。但是当特别调用_controlfp_s时,我相信这会在检测异常时强制抛出异常。。。正如在所有好机器上单步执行汇编代码时所看到的那样。道格(因为你是唯一一个尝试过的人)。。。我想你会对我的附加测试结果感兴趣的。我已采取以下故障排除步骤: