我试图捕获应用程序中所有未处理的异常,以便在发生异常时可以保存日志文件。这是一个使用 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);
相反,我只是得到标准的 Windows 崩溃对话框,而没有调用我的异常处理程序。但是,如果我在附加了调试器的 Visual Studio 中运行它,它会正确报告访问冲突异常。其他类型的访问违规也会触发处理程序:
float* ptr = nullptr;
float value = *ptr;
上面的代码触发异常处理程序。
我也尝试过使用 try/catch 或捕获 SIGSEGV 信号,但第一个示例都没有触发。中止/终止信号也不会被调用。简而言之,当崩溃发生时,我不会收到任何通知。
我想知道有什么方法可以在我的应用程序因第一个示例引起的访问冲突而崩溃之前在应用程序中获得某种通知吗?由于 VS 似乎能够检测到它,我假设有一种方法。
编辑:
我只是想澄清一下,我在发布模式下运行代码,第一个示例中的错误不是由在调试模式下完成的迭代器越界检查引起的。
编辑2:
我提供了使用 win32 控制台应用程序所能想到的最简单的示例。在这里查看:http://pastebin.com/8L1SN5PQ http://pastebin.com/8L1SN5PQ
确保在没有附加调试器的发布模式下运行它。