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();
}
我的客户端在使用我编写的 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();
}