7

我的客户在使用我编写的 VB6 程序时遇到软件崩溃。

我已经设置了注册表以生成完整的故障转储,并且我看到它可以与其他在其系统上崩溃的程序一起正常工作,但由于某种原因,对于我的程序,它仍然在完全不同的目录中创建简单的故障转储。

我的程序是在 x64 计算机上运行的 32 位程序。我已经为 SOFTWARE\Microsoft 和 SOFTWARE\Wow6432Node\Microsoft 设置了如图所示的注册表。

还是不行。

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

我所做的注册表更改

4

1 回答 1

10

要写入的文件夹的权限

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

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

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

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

注册表项的权限

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

LocalDumps 权限

32 与 64 位

Windows 错误报告由 Windows 执行,并且仅使用具有操作系统位数的注册表项。你说你设置了两个。如果这是真的,那很好。如果您只设置了 32 位注册表项,它将无法正常工作。

调试

如果您有 AeDebug 设置HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug,则这些设置在 WER 之前执行。

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

通常这应该会导致启动调试器,但谁知道......它可能什么也不做,只是退出。

LocalDumps 已禁用

确保没有Disabled值为1in的 DWORDHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps

使用 REG_SZ 而不是 REG_EXPAND_SZ

我见过有人将 REG_SZDumpFolder%APPDATA%. 只有 REG_EXPAND_SZ 会扩展环境变量。

有人取消了故障转储生成

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

将 DWORD 设置DontShowUI1禁用对话框。

用户设置而不是机器设置

有机器范围的设置

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();
}
于 2015-05-26T21:18:13.067 回答