我的客户正在使用我编写的VB6程序遇到软件崩溃。
我已经设置了注册表以生成完整的崩溃转储,我看到它与其他程序崩溃的系统正常工作,但出于某种原因,对于我的程序,它stil创建了一个完全不同的简单崩溃转储。目录
我的程序在x64计算机上运行32位。我已经设置了如图所示的注册表,包括SOFTWARE \ Microsoft和SOFTWARE \ Wow6432Node \ Microsoft。
仍然无效。
有没有人知道如何确保每次程序崩溃时都会产生完整的崩溃转储?
答案 0 :(得分:5)
查看文件夹C:\ProgramData\Microsoft\Windows\WER
的权限
创建子文件夹LocalDumps
将继承权限。
因此,您应该修改该文件夹的权限,或者使用具有写权限的其他文件夹。
如果权限不允许,Windows可能无法读取注册表设置。例如。以下(非常愚蠢)权限也会阻止LocalDump:
Windows错误报告由Windows执行,仅使用具有操作系统位数的注册表项。你说你设置了两个。如果这是真的,那很好。如果您只设置32位注册表项,它将无法正常工作。
如果您有AeDebug HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug
的设置,则会在WER之前执行。
请注意,此条目可能存在于32位(WOW6432Node)和64位。
通常这会导致启动调试器,但谁知道......它可能什么也不做,只是退出。
确保Disabled
1
的DWORD HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps
我见过人们将DumpFolder
的REG_SZ与%APPDATA%
结合使用。只有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();
}