【发布时间】:2012-11-15 11:50:11
【问题描述】:
我们在 Windows 上,我们希望为应用程序意外退出的所有场景获取故障转储(可能使用MiniDumpWriteDump)。
到目前为止,我们已经确定并设置了以下内容:
-
SetUnhandledExceptionFilter用于未处理的异常(Win32 以及“普通”C++ 异常。) -
_set_invalid_parameter_handler用于 CRT 无效参数处理 -
_set_abort_behavior加上一个SIGABRT处理程序来说明对abort()的调用
我们错过了什么吗? (取模一些非法调用ExitProcess、TerminateProcess 或exit 变体之一的代码。)
我会注意到,这里的这个问题与如何然后获得故障转储是正交的。例如,如果您想在abort 的情况下进行故障转储,则必须始终使用_set_abort_behaviour,否则只会中止exits。
我还要注意,在 Windows7+ 上,不设置 SetUHEF 而只设置 "correct" WER dump settings in the registry 通常是一种可行的方法。
【问题讨论】:
-
您是否考虑过使用 crashrpt 之类的东西:不过,它的目的是生成堆栈回溯(文本)而不是小型转储。 code.google.com/p/crashrpt
-
调用堆栈文件(文本)也可以在全局异常处理程序中使用
StackWalk64生成。 -
我记得微软声称尝试在进程内进行操作是危险的。如果应用程序遇到异常,您将无法信任应用程序的状态。虽然在很多很多情况下,您都会侥幸逃脱(就像许多流行的商业软件一样),但要抓住每个案例的唯一方法是在单独的进程中设置一个看门狗。
-
@AdrianMcCarthy - 是的,in-process 不是最理想的,但大部分时间都有效。不过我会添加一个注释。
标签: c++ windows visual-c++ crash-dumps