最近幾天這讓我感到困惑!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上運行時出現同樣的奇怪行爲。
在此先感謝。
許多這些條件不是馬上被發現的,而是在某些操作發現它處於不良狀態時發生的。這種行爲很可能是CPU特定的。 –
另外請注意,在絕望中,我已經卸載/重新安裝了與Visual Studio相關的所有內容。當然,結果相同。 – ThermoX
問題是......這個突破對於我測試過的每一臺機器(贏得7 x64,贏得服務器2008 R2,XP)和各種CPU都完美無缺......並且它總是按預期工作。這段代碼非常古老,一直在運行。我認爲這可能是在計算機BIOS或東西...某些MB/CPU機器特定的優化,搞砸了處理...但我仍然得到相同的結果時,關閉除1個CPU和所有優化設置通過BIOS。 – ThermoX