1

谁能告诉我下一个函数的代码,它会引发 EXCEPTION_FLT_STACK_CHECK 或 EXCEPTION_BREAKPOINT,因为我可以在主函数中捕获它们:

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,我还需要一个代码片段

4

2 回答 2

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;
于 2010-10-10T14:48:06.550 回答
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;
}

`

于 2010-10-10T15:04:28.767 回答