Windows 即使注册表设置正确,也不会生成完整的故障转储

Windows does not produce full crash dumps even though registry is set correctly

我的客户端在使用我编写的 VB6 程序时出现软件崩溃。

我已将注册表设置为生成完整的故障转储,我看到它与其他在其系统上崩溃的程序一起正常工作,但出于某种原因,对于我的程序,它仍然在完全不同的目录。

我的程序是 x64 计算机上的 32 位 运行。如图所示,我已经为 SOFTWARE\Microsoft 和 SOFTWARE\Wow6432Node\Microsoft.

设置了注册表

还是不行。

有谁知道我如何确定每次程序崩溃时都会生成完整的故障转储?

要写入的文件夹的权限

查看文件夹C:\ProgramData\Microsoft\Windows\WER的权限

  • 读取和执行
  • 列出文件夹内容
  • 阅读

创建子文件夹LocalDumps将继承权限。

因此您应该修改该文件夹的权限或使用具有写入权限的其他文件夹。

注册表项的权限

如果权限不允许,

Windows 可能无法读取注册表设置。例如。以下(非常愚蠢)权限也将阻止 LocalDump:

32 位与 64 位

Windows 错误报告由 Windows 执行,仅使用位数为 OS 的注册表项。你说你设置了两个。如果那是真的,那很好。如果您只设置 32 位注册表项,它将不起作用。

AeDebug

如果您有 AeDebug 的设置 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug,它们会在 WER 之前执行。

请注意,此条目可能存在于 32 位 (WOW6432Node) 和 64 位中。

通常这会导致启动调试器,但谁知道呢……它可能什么都不做就退出。

LocalDumps 已禁用

确保 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps

中没有值为 1 的 DWORD Disabled

使用REG_SZ代替REG_EXPAND_SZ

我看到有人将 DumpFolder%APPDATA% 结合使用 REG_SZ。只有REG_EXPAND_SZ会展开环境变量。

有人取消了故障转储生成

如果启用了 WER 对话框,有人可能会按下取消按钮。

将 DWORD DontShowUI 设置为 1 以禁用对话框。

用户设置而不是机器设置

有机器范围的设置

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Windows Error Reporting

还有

中的用户定义设置
HKEY_CURRENT_USER\Software\Microsoft\Windows\Windows Error Reporting

可能机器值被用户设置覆盖了。

先试用再使用

要测试您的设置是否有效,您可以使用一个小的 C++ 程序进行测试。

#include "stdafx.h"
#include <exception>

int _tmain(int /*argc*/, _TCHAR* /*argv*/[])
{
    throw std::exception();
}