处理应用程序中的访问冲突

Handling access violation in applications

本文关键字:访问冲突 应用程序 处理      更新时间:2023-10-16

我的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在这种情况下不起作用?

从 MSDN 网站:

您的翻译器函数应该只抛出键入C++ 例外。如果它除了投掷之外还做任何事情(例如 写入日志文件,例如)您的程序可能不表现为 预期,因为转换器函数的次数 调用取决于平台。

添加简单异常类时:

class myException{
};

然后在 my_se_translator 函数中抛出异常,并在示例应该工作的 main 函数或测试函数中捕获异常。

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;
}