-windows错误报告控制台
一个进程因为未处理异常而终止时,WER会创建关于未处理异常及其执行上下文的错误报告。
如得到用户许可,报告会通过安全信道发给microsoft服务器,在那里它和数据库已知问题比较,如有解决方案,服务器将它发给用户。
用户不发送报告给microsoft服务器,生成的报告会保存在用户机器上,通过WER控制台,用户可在本地机器上浏览查看报告。
Program Reports andSolutions–>View problem history。
WER生成的4个文件的详细信息。
AppCompat.txt 失败进程导入的模块列表
Memory.hdmp 失败进程的用户模式转储,包含,栈,堆,句柄表格。
MiniDump.mdmp 失败进程用户模式小型转储。
Version.txt 当前安装版本
-可编程windows错误报告
HRESULT WerSetFlags(DWORD dwFlags);
HRESULT WerGetFlags(HANDLE hProcess, PDWORD pdwFlags);
// 禁用报告生成与发送
HRESULT WerAddExcludedApplication(PCWSTR pwzExeName, BOOL bAllUsers);
// 启用错误报告生成和发送
HRESULT WerRemoveExcludedApplication(PCWSTR pwzExeName, BOOL bAllUsers);
WER_FAULT_REPORTING_*xx
xx:
FLAG_NOHEAP=1 生成的报告不含堆信息
FLAG_DISABLE_THREAD_SUSPENSION=4
FLAG_QUEUE=2
FLAG_QUEUE_UPLOAD=8
-对进程中所有的问题报告进行定制
可能需定制错误报告情况:
在编写自己的未处理异常过滤程序
在未处理异常没发生下也生成报告
往错误报告添加更多信息
// 添加任意数据块
// 调用此函数后,问题发生时,范围内的字节会存在小型转储中,
// 可用事后调试器查看这些字节。
// 可多次用WerRegisterMemoryBlock将多个数据块存在小型转储中
HRESULT WerRegisterMemoryBlock(
// 内存地址
PVOID pvAddress,
// 尺寸
DWORD dwSize
);
// 每当一个问题报告生成,下面的函数注册的文件都会保存在报告里。
// 添加任意文件到问题报告
HRESULT WerRegisterFile(
// 目标文件的路径名
PCWSTR pwzFilename,
// WerRegFileTypeUserDocument 文档文件
// WerRegFileTypeOther
WER_REGISTER_FILE_TYPE regFileType,
// WER_FILE_xx
// xx:
// DELETE_WHEN_DONE 提交报告后就删除文件
// ANONYMOUS_DATA
DWORD dwFlags
);
// 移除
HRESULT WerUnregisterMemoryBlock(PVOID pvAddress);
HRESULT WerUnregisterFile(PCWSTR pwzFilePath);
-问题报告的创建与定制
HKEY_CURRENT_USER\Software\Microsoft\Windows\Windows Error Reporting\
MaxArchiveCount 存档中文件数目上限
MaxQueueCount 发给Microsoft服务器前保存在本地机器队列里的报告数目上限。
// 问题报告的创建,定制,提交给WER按以下步骤调用不同函数实现:
1.WerReportCreate创建新报告
typedef struct _WER_REPORT_INFORMATION {
DWORD dwSize;
HANDLE hProcess;
WCHAR wzConsentKey[64];
WCHAR wzFriendlyEventName[128];
WCHAR wzApplicationName[128];
WCHAR wzApplicationPath[MAX_PATH];
WCHAR wzDescription[512];
HWND hwndParent;
} WER_REPORT_INFORMATION, *PWER_REPORT_INFORMATION;
HRESULT WerReportCreate(
// 作为问题签名第一个元素的Unicode字符串
PCWSTR pwzEventType,
// WerReportNonCritical 将报告放入队列,依据同意设置上传Microsoft服务器
// WerReportCritical 将报告放入本地队列
// WerReportApplicationCrash
// WerReportApplicationHang
WER_REPORT_TYPE repType,
//
PWER_REPORT_INFORMATION pReportInformation,
// 执行成功时,返回报告句柄
HREPORT* phReport
);
2.WerReportSetParameter零次或多次设置报告
HRESULT WINAPI WerReportSetParameter(
// 报告句柄
_In_ HREPORT hReportHandle,
// 键值对
// WER_P0---WER_P9
// 如传入的dwparamID不在WER_P0---WER_P9,失败,返回:E_INVALIDARG。如设置WER_PX,则WER_P0---WER_P(X-1)也要设置
_In_ DWORD dwparamID,
_In_opt_ PCWSTR pwzName,
_In_ PCWSTR pwzValue
);
对非定制报告,WER的默认参数:
1 程序名
2 程序版本
3 标明程序二进制文件构建的时间戳
4 失败模块名称
5 失败模块版本
6 标明程序二进制文件构建的时间戳
7 异常代码,记载刚发生异常类型
8 发生错误地方相对模块起始位置偏移量
3.WerReportAddDump将小型转储放进报告
HRESULT WINAPI WerReportAddDump(
_In_ HREPORT hReportHandle,
// 句柄须具备:
// STANDARD_RIGHTS_READ
// PROCESS_QUERY_INFORMATION
// 权限
_In_ HANDLE hProcess,
_In_opt_ HANDLE hThread,
// 转储文档类型相关
_In_ WER_DUMP_TYPE dumpType,
// 额外异常信息
_In_opt_ PWER_EXCEPTION_INFORMATION pExceptionParam,
// 转储文档类型相关
_In_opt_ PWER_DUMP_CUSTOM_OPTIONS pDumpCustomOptions,
// 0
// WER_DUMP_NOHEAP_ONQUEUE
_In_ DWORD dwFlags
);
4.WerReportAddFile零次或多次将任意文件放进报告
HRESULT WINAPI WerReportAddFile(
_In_ HREPORT hReportHandle,
_In_ PCWSTR pwzPath,
// WerFileTypeMicrodump
// WerFileTypeMinidump
// WerFileTypeHeapdump
// WerFileTypeUserDocument
// WerFileTypeOther
_In_ WER_FILE_TYPE repFileType,
_In_ DWORD dwFileFlags
);
5.WerReportSetUIOption修改一些字符串
HRESULT WINAPI WerReportSetUIOption(
_In_ HREPORT hReportHandle,
_In_ WER_REPORT_UI repUITypeID,
_In_ PCWSTR pwzValue
);
6.WerReportSubmit提交报告。
HRESULT WINAPI WerReportSubmit(
_In_ HREPORT hReportHandle,
// WerConsentNotAsked
// WerConsentApproved
// WerConsentDenied
_In_ WER_CONSENT consent,
// HONOR_RECOVERY
// HONOR_RESTART
// SHOW_DEBUG
// NO_CLOSE_UI
// START_MINIMIZED
// QUEUE
// NO_QUEUE
// NO_ARCHIVE
// OUTOFPROCESS
// OUTOFPROCESS_ASYNC
// ADD_REGISTERED_DATA
_In_ DWORD dwFlags,
//
_Out_opt_ PWER_SUBMIT_RESULT pSubmitResult
);
7.WerReportCloseHandle关闭报告
HRESULT WINAPI WerReportCloseHandle(
_In_ HREPORT hReportHandle
);
-应用的自动重启与恢复
WER允许应用终止后自动重启。
// 在WER中注册自己
HRESULT RegisterApplicationRestart(
PCWSTR pwzCommandline,
// RESTART_NO_CRASH 崩溃下不重启
// RESTART_NO_HANG 挂起下不重启
// RESTART_NO_PATCH 安装更新后不重启
// RESTART_NO_REBOOT
DWORD dwFlags
);
HRESULT UnregisterApplicationRestart();
-对应用恢复支持
HRESULT RegisterApplicationRecoveryCallback(
APPLICATION_RECOVERY_CALLBACK pfnRecoveryCallback,
PVOID pvParameter,
DWORD dwPingInterval,
DWORD dwFlags
);
// APPLICATION_RECOVERY_CALLBACK
DWORD WINAPI ApplicationRecoveryCallback(PVOID pvParameter);
// 示例:
DWORD WINAPI ApplicationRecoveryCallback(PVOID pvParameter)
{
DWORD dwReturn = 0;
BOOL bCancelled = FALSE;
while(!bCancelled)
{
ApplicationRecoveryInProgress(&bCancelled);
if(bCancelled)
{
...
ApplicationRecoveryFinished(FALSE);
}
else
{
if(MoreInformationToSave(())
{
///
}
else
{
ApplicationRecoveryFinished(TRUE);
bCancel = TRUE;
}
}
}
return dwReturn;
}