我可能完全误解了如何使用谷歌突破板API,如果是这样的话,我愿意接受评论/建议/粗鲁的评论。我试图调用以下C++函数:
bool WriteMinidumpForException(EXCEPTION_POINTERS* exinfo);我引用了一个std::exception
try {
return QApplication::notify(receiver, event);
} catch (std::exception &ex) {
eh_.WriteMinidumpForException(?????);
// ... do some more stuff and ultimately kill this process
}(eh_是一个google_breakpad::ExceptionHandler。)
我在?里放了什么?
背景:之所以需要这样做(我认为)是因为Qt不支持事件处理程序中抛出的异常。它将无法正确传播,因此,由于异常的实际上下文已经丢失,“断续板”产生的最小值是完全无用的。相反,您必须捕获所有异常并在QApplication::notify()覆盖中处理它们,这正是我要做的。在出现异常的情况下,我想立即为该异常编写我的minidump (听起来像是WriteMinidumpForException会做的),然后通知用户并退出应用程序。但是我不知道作为EXCEPTION_POINTERS*参数应该传递什么。
发布于 2011-03-15 18:20:29
在MSVC编译器中,C++异常回滚到本机Windows管道(SEH,结构化异常处理)。虽然存在很大的阻抗失配,但是异常过滤器的概念在C++中并不是很好的匹配。在catch处理程序捕获异常时,SEH异常已经被处理,堆栈被打开。EXCEPTION_POINTERS的信息是戈佐。异常过滤器实际上是存在的,这就是它为您想要捕获的特定类型过滤的方式,但是它们是由编译器自动生成的。不存在合理的C++语法来使它们有用。
您需要使用编译器支持来处理SEH异常。使用__try, __except关键字(__finally是可选的),让过滤器捕获C++异常的异常代码,0xe04d5343 ('MSC')。但是,您确实失去了捕捉特定C++异常类型的能力,即管道被隐藏在没有源的CRT中。在C++中尝试在__try中修复这个问题,这样__except只会看到C++代码没有过滤的异常。
使用SetUnhandledExceptionFilter()是进行此操作的另一种方式,您确实应该考虑将它作为任何未处理异常的最终后盾,而不依赖于代码位置。这是最好的方法来创建一个小型的崩溃应用程序。最后但并非最不重要的一点是,在进程本身内创建一个崩溃的应用程序并不是最好的方法。有很大的可能性,这将不能很好地工作,进程状态可能会损坏相当严重。一种失败模式是将进程堆锁定。考虑到堆损坏是非常常见的崩溃原因,这并不是不可能的。用一个“保护进程”来修正这个问题,使用一个命名的事件来发出信号,使它成为一个小型的进程。您的异常筛选器只需要设置始终有效的事件。
发布于 2011-03-15 17:59:19
Windows和c++异常不会以任何方式交织在一起--解决这个问题的简单方法是使用您自己的__try __except包装,例如取消对空指针的引用。
类似于:
__try {
* (int *) 0 = 0;
}
__except
(
eh_.WriteMinidumpForException(GetExceptionInformation()), EXCEPTION_EXECUTE_HANDLER
)
{
}https://stackoverflow.com/questions/5315885
复制相似问题