Имитация аппаратных исключений - PullRequest
1 голос
/ 10 октября 2010

Может кто-нибудь сказать мне код для следующей функции, которая вызывает 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

Ответы [ 2 ]

2 голосов
/ 10 октября 2010

Исключение точки останова вызывается легко.Вы можете использовать один из следующих (который все тот же):

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 голос
/ 10 октября 2010

Предполагая 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;
}

`

...