1

最近幾天這讓我感到困惑!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上運行時出現同樣的奇怪行爲。

在此先感謝。

+0

許多這些條件不是馬上被發現的,而是在某些操作發現它處於不良狀態時發生的。這種行爲很可能是CPU特定的。 –

+0

另外請注意,在絕望中,我已經卸載/重新安裝了與Visual Studio相關的所有內容。當然,結果相同。 – ThermoX

+0

問題是......這個突破對於我測試過的每一臺機器(贏得7 x64,贏得服務器2008 R2,XP)和各種CPU都完美無缺......並且它總是按預期工作。這段代碼非常古老,一直在運行。我認爲這可能是在計算機BIOS或東西...某些MB/CPU機器特定的優化,搞砸了處理...但我仍然得到相同的結果時,關閉除1個CPU和所有優化設置通過BIOS。 – ThermoX

回答