Dav*_*eer 4 c++ winapi qt exception google-breakpad
我可能完全误解了如何使用Google Breakpad API,如果是这样的话,我会对评论/建议/粗鲁评论持开放态度.我试图调用以下C++函数:
bool WriteMinidumpForException(EXCEPTION_POINTERS* exinfo);
Run Code Online (Sandbox Code Playgroud)
我有一个参考std::exception:
try {
return QApplication::notify(receiver, event);
} catch (std::exception &ex) {
eh_.WriteMinidumpForException(?????);
// ... do some more stuff and ultimately kill this process
}
Run Code Online (Sandbox Code Playgroud)
(eh_是一个google_breakpad::ExceptionHandler.)
我把什么放在?????
背景:这是必要的(我认为)是Qt不支持在事件处理程序中抛出的异常.它不会正确传播,因此Breakpad产生的minidump完全没用,因为异常的实际上下文已经丢失.相反,你必须捕获所有异常并在覆盖中处理它们QApplication::notify(),这正是我想要做的.在异常的情况下,我想立即为该异常编写我的minidump(听起来WriteMinidumpForException会这样),然后通知用户并退出应用程序.但我不确定要作为EXCEPTION_POINTERS*参数传递什么.
在MSVC编译器中,C++异常捎带到本机Windows异常管道(SEH,结构化异常处理).但是,阻抗不匹配相当大,异常过滤器的概念在C++中没有很好的匹配.当catch处理程序捕获异常时,已经处理了SEH异常并且堆栈已解除.EXCEPTION_POINTERS信息是奇闻趣事.实际上存在异常过滤器,它是如何过滤您想要捕获的特定类型,但它们是由编译器自动生成的.没有合理的C++语法可以使它们有用.
您需要深入了解编译器支持以处理SEH异常.使用__try, __except关键字(__finally是可选的)并让您的过滤器捕获C++异常的异常代码0xe04d5343('MSC').但是,您确实失去了捕获特定C++异常类型的能力,即管道在没有源代码的情况下隐藏在CRT中.把C++ 尝试内__try修理好了所以你__except只能看到不同的是,C++代码没有进行过滤.
使用SetUnhandledExceptionFilter()是另一种方法,btw,你真的应该认为它作为任何未处理的异常的最终支持,独立于代码位置.这是创建崩溃应用程序的minidump的最佳方法.最后但并非最不重要的一点是,在流程内部创建崩溃应用程序的minidump并不是最好的方法.有很多可能性不会很好,过程状态可能会被严重损坏.一种失败模式是将进程堆锁定.考虑到堆损坏是一种非常常见的崩溃原因,这并非不可能.使用"保护进程"修复此问题,使用命名事件来发出信号以生成小型转储.您的异常过滤器只需要设置始终有效的事件.