【问题标题】:Windows Error Reporting insists on NOT creating full dumps on software crashesWindows 错误报告坚持不要在软件崩溃时创建完整转储
【发布时间】:2015-07-02 08:51:56
【问题描述】:

我正在尝试在生产机器上调试我的应用程序。它大约每 2 天崩溃一次,我不知道为什么。

我这几天一直在尝试让生产机器在程序崩溃时生成完整的崩溃转储。有时确实如此,但有时,它不会生成完整的故障转储,而是创建简短的文本文件,简单地列出所有加载的模块并说明程序崩溃。这些短文件保存在 %LOCALAPPDATA%\Microsoft\Windows Error Reporting\ReportArchive 中。

对于我的一生,我无法理解为什么会这样!我不能要求这些用户运行 adplus 或 windbg 或类似的东西。每次程序崩溃时,我只需要创建一个崩溃转储。

有人可以帮忙吗?我附上了 WER 的完整注册表设置。这些存在于 HKEY_LOCAL_MACHINE\Software\Wow6432Node 和 64 位节点上。如您所见,LocalDumps 键指向 C:\ProgramData\Microsoft\Windows\WER\LocalDumps 以保存故障转储,是的,每个人都拥有此文件夹的完全权限。

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\Windows Error Reporting]
"ErrorPort"="\\WindowsErrorReportingServicePort"
"MaxQueueSizePercentage"=dword:00000001
"PurgeThreshholdValueInKB"=dword:0000000a
"Disabled"=dword:00000000
"MaxQueueCount"=dword:00000032
"DisableQueue"=dword:00000000
"LoggingDisabled"=dword:00000000
"DontSendAdditionalData"=dword:00000000
"AutoApproveOSDumps"=dword:00000001
"MaxQueueSize"=dword:00000400
"ForceQueue"=dword:00000001
"DontShowUI"=dword:00000001
"ConfigureArchive"=dword:00000002
"MaxArchiveCount"=dword:000001f4
"DisableArchive"=dword:00000000
"LastQueuePesterTime"=hex(b):57,18,42,be,ba,81,d0,01
"LastLiveReportFlushTime"=hex(b):87,cf,56,3d,bc,81,d0,01
"LastQueueNoPesterTime"=hex(b):4d,39,bb,3a,51,97,d0,01
"LastRateLimitedDumpGenerationTime"=hex(b):87,84,74,9b,90,85,d0,01

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\Windows Error Reporting\BrokerUp]
"WWAJSE"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\Windows Error Reporting\Consent]
"SQLException64"=dword:00000004
"SQLException"=dword:00000004
"DefaultConsent"=dword:00000004
"DefaultOverrideBehavior"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\Windows Error Reporting\Debug]
"ExceptionRecord"=hex:de,fa,ed,0e,01,00,00,00,00,00,00,00,98,45,4d,75,07,00,00,\
  00,81,f8,46,00,dc,37,49,00,88,37,49,00,00,00,00,00,c0,fe,18,00,fc,fe,18,00,\
  1c,f9,18,00,02,00,00,00,04,f9,18,00,00,00,00,00,0c,f9,18,00,96,27,40,00,da,\
  3b,40,00,f0,0c,45,00,e2,31,40,00

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\Windows Error Reporting\HeapControlledList]

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\Windows Error Reporting\HeapControlledList\dwm.exe]
"EnableHeapThrottle"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\Windows Error Reporting\LocalDumps]
"DumpFolder"="C:\\ProgramData\\Microsoft\\Windows\\WER\\LocalDumps"
"DumpCount"=dword:0000000a
"DumpType"=dword:00000002
"CustomDumpFlags"=dword:00000000

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\Windows Error Reporting\RuntimeExceptionHelperModules]
"C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\mscordacwks.dll"=dword:00000000

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\Windows Error Reporting\WMR]
"Disable"=dword:00000001

【问题讨论】:

  • 所以有人只是随机投票结束这个问题,并没有说明原因?
  • 您是否尝试过通过在 LocalDumps 键下添加您的应用程序来覆盖global WER settings?不确定它是否会起作用,但是,WER 很挑剔,所以值得一试。
  • @rrrower - 感谢您的回答。我确实尝试过,但那是在我更改 Microsoft\Windows\Windows 错误报告中的一堆设置之前。我想我可以再试一次。
  • WER 由操作系统实现。操作系统是 64 位的,所以它总是在 64 位节点中查找。摆脱 Wow6432Node 注册表设置。您说“这些存在......并且在 64 位节点上”,但您没有向我们展示 64 位设置(这是重要的设置)。

标签: crash-reports postmortem-debugging windows-error-reporting


【解决方案1】:

移动您添加的值

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\Windows Error Reporting\LocalDumps]

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\ProgramName.exe]

例如:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\Snagit32.exe]
"CustomDumpFlags"=dword:00000000
"DumpCount"=dword:00000003
"DumpFolder"=hex(2):25,00,4c,00,4f,00,43,00,41,00,4c,00,41,00,50,00,50,00,44,\
  00,41,00,54,00,41,00,25,00,5c,00,54,00,65,00,63,00,68,00,53,00,6d,00,69,00,\
  74,00,68,00,5c,00,53,00,6e,00,61,00,67,00,69,00,74,00,5c,00,43,00,72,00,61,\
  00,73,00,68,00,44,00,75,00,6d,00,70,00,73,00,00,00
"DumpType"=dword:00000002

您在 HKLM 的 Windows 错误报告密钥的 32 位版本中设置了“DontShowUI”=dword:00000001(如图所示),但这将被 HKCU 中的值覆盖,例如:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Windows\Windows Error Reporting]
<other entries not shown>
"DontShowUI"=dword:00000000

确保您没有通过调用为您的进程禁用 WER

SetErrorMode(SEM_NOGPFAULTERRORBOX);

SEM_NOGPFAULTERRORBOX 设置将阻止 Windows 错误报告处理崩溃,因此如果您调用 SetErrorMode,请忽略此标志。

如果注册表或 SetErrorMode 未禁用 WER,Windows 错误报告将支持 LocalDumps 键。将 DontShowUI 设置为 1 将阻止出现崩溃对话框,但不会阻止在启用 WER 时创建 LocalDumps。

【讨论】:

  • 这个答案对我发现我对SEM_NOGPFAULTERRORBOX 的使用抑制了我的崩溃报告非常有帮助。谢谢!事实上,这也阻止了我的崩溃出现在 Windows 事件查看器中。它似乎压制了曾经发生过崩溃的任何/所有证据。然而,有趣的是,删除 SEM_NOGPFAULTERRORBOX 似乎不会重新启用 WER 对话框。如果您想看一眼,我已经在stackoverflow.com/questions/68728694/… 上发布了一个相关的详细问题。
【解决方案2】:

我的两分钱(即使旧..但也许有用) 在 windows7 和 win10 64 位下测试。它确实有效。

提示:密钥以十六进制保存,但您也可以简单地使用: (保存在 *.REG 文件中)

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps]
"DumpCount"=dword:0000000a
"DumpType"=dword:00000002
"DumpFolder"="c:\\CrashDumps"

【讨论】:

    猜你喜欢
    • 2020-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-30
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    相关资源
    最近更新 更多