2010-10-10 57 views
1

誰能告訴我下一個功能的代碼,這引起了EXCEPTION_FLT_STACK_CHECK或EXCEPTION_BREAKPOINT,因爲我能趕上他們在主FUNC:仿硬件異常的

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    __try 
    { 
     FaultingStack(); // What I need to write in this function??? 
    } 
    __except(GetExceptionCode() == EXCEPTION_FLT_STACK_CHECK ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) 
    { 
     return FALSE; 
    } 
    return TRUE; 

    return 0; 
} 

不建議的RaiseException FUNC,我需要的例子故障代碼,而不是軟件引發的異常

UPD:我需要一個異常EXCEPTION_INT_OVERFLOW

回答

2

斷點異常容易引發多了一個代碼段。您可以使用以下步驟之一(這是所有相同):

DebugBreak(); // API function 
__debugbreak(); // MSVC intrinsic 
__asm int 3; // Actual instruction 

現在,EXCEPTION_FLT_STACK_CHECK是關係到無效的浮點寄存器堆棧狀態。

第一個應該使相關FP堆棧FP例外:

#include <float.h> 
_clearfp(); 
_controlfp(_controlfp(0, 0) & ~(EM_INVALID), MCW_EM); 

接下來,使FP堆棧溢出/下溢:

for (float f; ;) 
    __asm fstp f; 
1

假設MSVC,因爲這是一個Windows的問題。您可以通過使用__debugbreak()內在函數來獲得斷點異常。測試時無需附加調試器。浮點堆棧檢查錯誤要求取消掩蓋FPU控制字中的溢出/溢出異常。並且,比如說,經常彈出堆棧。我滾他們都在一個示例程序:

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    // STATUS_BREAKPOINT 
    __debugbreak(); 

    // STATUS_FLOAT_STACK_CHECK 
    _control87(_EM_UNDERFLOW | _EM_OVERFLOW, _MCW_EM); 
    double temp = 0; 
    __asm { 
     fstp [temp] 
     fstp [temp] 
    } 
    return 0; 
} 

`