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関数を提案しないでください。ソフトウェアで発生した例外ではなく、障害コードの例が必要です

UPD: 次の例外 EXCEPTION_INT_OVERFLOW 用にもう 1 つのコード スニペットが必要です

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

これはWindowsの質問であるため、MSVCを想定しています。__debugbreak() 組み込み関数を使用すると、ブレークポイント例外を取得できます。デバッガを接続せずにテストします。浮動小数点スタック チェック フォールトでは、FPU 制御ワードでアンダーフロー/オーバーフロー例外のマスクを解除する必要があります。そして、たとえば、スタックを頻繁にポップします。両方を 1 つのサンプル プログラムにまとめました。

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 に答える