【问题标题】:Handling access violation in applications处理应用程序中的访问冲突
【发布时间】:2013-12-26 23:37:48
【问题描述】:

我的 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 在这种情况下不起作用的一个很好的解释?

【问题讨论】:

  • 在哪个操作系统上?用哪个编译器?
  • 操作系统:Windows,编译器:MSVC。
  • _set_se_translator 用于设置将 Win32 异常转换为 C++ 异常的函数。也许行为正在得到优化,因为您的代码中没有 C++ 异常处理。使用__try/__except 直接捕获 Win32 异常可能会更好。

标签: c++ exception-handling


【解决方案1】:

来自MSDN website

你的翻译函数应该只是抛出一个 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;
}

【讨论】:

  • 非常感谢,微软做了这样的事情很奇怪,如果我想向我的_se_translator中的所有线程发出应用程序关闭事件并尝试以我自己的方式退出进程怎么办,他们不太允许这样做。
  • 你仍然可以在 catch() 中实现这个{}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-04
  • 1970-01-01
  • 2010-11-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多