gpt4 book ai didi

c++ - 在所有错误情况下,我需要采取哪些操作来获取故障转储?

转载 作者:IT老高 更新时间:2023-10-28 23:19:29 32 4
gpt4 key购买 nike

我们在 Windows 上,我们希望为应用程序意外退出的所有场景获取故障转储(可能使用 MiniDumpWriteDump)。

到目前为止,我们已经确定并设置了以下内容:

  • SetUnhandledExceptionFilter 用于未处理的异常(Win32 以及“普通”C++ 异常。)
  • _set_invalid_parameter_handler 用于 CRT 无效参数处理
  • _set_abort_behavior加上一个 SIGABRT 处理程序来说明对 abort()
  • 的调用

我们错过了什么吗? (取模一些非法调用 ExitProcessTerminateProcessexit 变体之一的代码。)


我会注意到,这里的这个问题与如何然后获得故障转储是正交的。例如,如果您想在 abort 的情况下进行故障转储,则必须始终使用 _set_abort_behaviour,否则只会中止 exits。

我还要注意,在 Windows7+ 上,不是 设置 SetUHEF 并且只是设置 "correct" WER dump settings in the registry通常是一种可行的方法。

最佳答案

我使用的正是你列出的那些,加上 _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);
}
}
}

来源: 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/07/22/more-adventures-in-failing-to-crash-properly/

关于c++ - 在所有错误情况下,我需要采取哪些操作来获取故障转储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13591334/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com