在所有错误情况下,我需要采取哪些措施来获取崩溃转储?

Mar*_* Ba 12 c++ windows crash-dumps visual-c++

我们在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并且只是在注册表中设置"正确的"WER转储设置通常是可行的方法.

Ben*_*ers 6

我正好使用你列出的那些_set_purecall_handler,加上这个方便的代码片段:

void EnableCrashingOnCrashes()
{
    typedef BOOL (WINAPI *tGetPolicy)(LPDWORD lpFlags);
    typedef BOOL (WINAPI *tSetPolicy)(DWORD dwFlags);
    static const DWORD EXCEPTION_SWALLOWING = 0x1;

    const HMODULE kernel32 = LoadLibraryA("kernel32.dll");
    const tGetPolicy pGetPolicy = (tGetPolicy)GetProcAddress(kernel32, "GetProcessUserModeExceptionPolicy");
    const tSetPolicy pSetPolicy = (tSetPolicy)GetProcAddress(kernel32, "SetProcessUserModeExceptionPolicy");
    if(pGetPolicy && pSetPolicy)
    {
        DWORD dwFlags;
        if(pGetPolicy(&dwFlags))
        {
            // Turn off the filter
            pSetPolicy(dwFlags & ~EXCEPTION_SWALLOWING);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

资料来源:http: //randomascii.wordpress.com/2012/07/05/when-even-crashing-doesnt-work/

他网站上的其他文章也帮助我理解了这一点:http : //randomascii.wordpress.com/2011/12/07/increased-reliability-through-more-crashes/ http://randomascii.wordpress.com/2012/ 7月22日/更多的冒险,在-没有到崩溃正确/