Обработка нарушения доступа в приложениях

0

Мое приложение x64 скомпилировано с /EHa,

Я хочу защитить свой код от нарушений доступа, но процесс приложения, похоже, сбой, независимо от моих обработчиков SEH и завершения.

void my_se_translator(unsigned int, struct _EXCEPTION_POINTERS*) {
    cout << "se_translator_called" << endl;
}

void my_terminate_handler() {
    cout << "my_terminate_handler_called" << endl;
}

#pragma optimize("", off)
void test() {

    int* k = nullptr;
    int z = *k;
}
#pragma optimize("", on)

int main(int argc, char* argv[]) {

    _set_se_translator(my_se_translator);
    set_terminate(my_terminate_handler);

    test();

    return 0;
}

Поблагодарили бы за хорошее объяснение, почему _set_se_translator не работает в этом случае?

  • 0
    На какой операционной системе? С каким компилятором?
  • 0
    ОС: Windows, Компилятор: MSVC.
Показать ещё 1 комментарий
Теги:
exception-handling

1 ответ

1
Лучший ответ

На веб-сайте MSDN:

Функция вашего переводчика должна делать не более, чем выброс исключенного типа C++. Если он делает что-либо в дополнение к метанию (например, запись в файл журнала, например), ваша программа может работать не так, как ожидалось, потому что количество раз, когда вызывается функция транслятора, зависит от платформы.

когда вы добавляете простой класс исключений:

class myException{
};

Затем отбросьте исключение в функции my_se_translator и поймайте исключение в основной или тестовой функции, которую должен работать ваш пример.

void my_se_translator(unsigned int, struct _EXCEPTION_POINTERS*) {
    std::cout << "se_translator_called" << std::endl;
    throw myException();
}

int main(int argc, char* argv[]) {


    _set_se_translator(my_se_translator);
    set_terminate(my_terminate_handler);
    try{
        test();
    }
    catch(myException e) {
        std::cout << "EXCEPTION!" << std::endl;
    }
    return 0;
}
  • 0
    Большое спасибо, довольно странно, что Microsoft сделала такую вещь, что если я захочу сообщить о событиях завершения работы приложения всем моим потокам в моем _se_translator и попытаться выйти из процесса по-своему, они этого не позволяют.
  • 1
    Вы все еще можете реализовать это в catch () {}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню