Ube*_*yon 6 c++ windows exception access-violation visual-studio
我试图在我的应用程序中捕获所有未处理的异常,以便我可以在它们出现时保存日志文件.这是一个使用Visual Studio 2013编译的64位Windows应用程序,用C++编写.为了测试我使用VS生成的默认C++ Win32项目.
我通过使用SetUnhandledExceptionFilter注册处理程序来捕获所有异常.这适用于/大多数/案例,但不是全部.捕获所有throw() - n异常,以及大多数硬件异常,例如浮点或访问冲突.不触发处理程序的代码是:
std::vector<int> foo(5, 0);
for (auto& f : foo)
foo.erase(foo.begin() + 1);
Run Code Online (Sandbox Code Playgroud)
相反,我只是获得标准的Windows崩溃对话框,而不会调用异常处理程序.但是,如果我在附带调试器的Visual Studio中运行它,它会正确报告访问冲突异常.其他类型的访问冲突也会触发处理程序:
float* ptr = nullptr;
float value = *ptr;
Run Code Online (Sandbox Code Playgroud)
上面的代码触发异常处理程序.
我也尝试过使用try/catch或捕获SIGSEGV信号,但是第一个例子都没有触发.中止/终止信号也不会被调用.简而言之,当崩溃发生时,我不会得到通知.
我想知道是否有任何方法可以在我的应用程序中获得某种通知,然后由于第一个示例导致的访问冲突而崩溃?由于VS似乎能够检测到它,我假设有一种方法.
编辑:我只想说明我在发布模式下运行代码,第一个示例中的错误不是由调试模式下的迭代器超出边界检查引起的.
EDIT2:我包含了一个最简单的例子,我可以使用win32控制台应用程序.请在此处查看:http: //pastebin.com/8L1SN5PQ
确保在未附带调试器的发布模式下运行它.
这些类型的运行时错误的处理方式不同,它们不会产生 SEH 异常。大致分为“编程错误”和“恶意软件攻击”之间。如果您没有附加调试器,则默认处理程序会使用 __fastfail() 调用即时死亡,其信息量与未捕获的 C++ 异常一样丰富。
您必须在 main() 函数中调用_set_invalid_parameter_handler()来更改它们的处理方式。您可以在自定义处理程序中抛出 C++ 异常,或者调用 RaiseException() 来触发 catch-em-all 处理程序,或者直接报告它们。倾向于后者,您希望确保进程始终终止。
请注意,您的代码片段不是最好的示例。当您在未启用迭代器调试的情况下构建程序(例如使用默认设置的发布构建)时,这就是 UB。UB 不保证您会获得 SEH 例外。如果确实如此,那么您必须非常仔细地编写异常过滤器,它将在仍保留堆锁的情况下调用,因此基本的东西无法工作。最好的方法是用命名事件唤醒守护进程。然后进行小型转储并终止程序。
| 归档时间: |
|
| 查看次数: |
2043 次 |
| 最近记录: |