windows核心编程---错误报告与应用程序恢复

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/x13262608581/article/details/78883893

-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零次或多次设置报告

扫描二维码关注公众号,回复: 2993697 查看本文章
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;
}

猜你喜欢

转载自blog.csdn.net/x13262608581/article/details/78883893