《Windows核心编程》读书笔记二十六章 错误报告与应用程序恢复

第二十六章 错误报告与应用程序恢复本章内容26.1 Windows错误报告控制台26.2 可编程的Windows错误报告26.3 对进程中所有的问题报告进行定制26.4 问题报告的创建与定制26.5 应用程序自动重启与恢复本章介绍Windows的错误报告以及其接口API。WER API可以了解程序运行失败的深层原因,更好发现和解决缺陷。26.1 Wi
摘要由CSDN通过智能技术生成

第二十六章 错误报告与应用程序恢复


本章内容

26.1 Windows错误报告控制台

26.2 可编程的Windows错误报告

26.3 对进程中所有的问题报告进行定制

26.4 问题报告的创建与定制

26.5 应用程序自动重启与恢复

本章介绍Windows的错误报告以及其接口API。WER API可以了解程序运行失败的深层原因,更好发现和解决缺陷。


26.1 Windows错误报告控制台

应用程序因为未处理异常而终止,WER会创建报告并发送给MS。

通过windows quality online services来访问MS内部数据库中相关的信息。



Memory.hdmp文件,可以用熟悉的调试器来启动一个事后调试会话(postmortem debug session)





26.2 可编程的Windows错误报告

存在于Kernel32.dll 的Werapi.h

HRESULT
WINAPI
WerSetFlags(
    _In_ DWORD dwFlags
    );



最后两个标志WER_FAULT_REPORTING_FLAG_QUEUE WER_FAULT_REPORTING_FLAG_QUEUE_UPLOAD的实际效果取决于当前的同意设置(consent setting)参考图25-5. 如果同意设置不是默认值,即查找解决方案,WER对这两个标志都会生成报告。但是,如果设置WER_FAULT_REPORTING_FLAG_QUEUE_UPLOAD。 WER会在发送报告前弹出确认对话框,而设置WER_FAULT_REPORTING_FLAG_QUEUE则不会发送报告。


要知道某个进程当前的WER设置,可以使用此函数

HRESULT
WINAPI
WerGetFlags(
    _In_ HANDLE hProcess,
    _Out_ PDWORD pdwFlags
    );
hProcess是要查询进程的句柄。必须具备 PROCESS_VM_READ访问属性。


禁用报告生成与发送

应用程序可以选择在失败时不让WER发送报告。(比如应用程序处于开发阶段)

HRESULT
WINAPI
WerAddExcludedApplication(
    _In_ PCWSTR pwzExeName,
    _In_ BOOL bAllUsers
    );

pwzExeName指出exe文件名或者完整路径

bAllUser指明禁用报告对所有登陆用户还是当前用户生效。如果选择TRUE,需要管理员权限。(否则返回E_ACCESSDENIED)

当未处理异常发生已经被WER排除的程序中,WER不会再生成报告,而是会弹出对话框(WerFault会启动)让用户选择调试还是终止应用。



如果要启动错误报告,可以调用函数WerRemoveExcludedApplication

HRESULT
WINAPI
WerRemoveExcludedApplication(
    _In_ PCWSTR pwzExeName,
    _In_ BOOL bAllUsers
    );


26.3 对进程中所有的问题报告进行定制

有时候可能需要调用一系列的WER函数定制错误报告。

1)我们在编写自己的未处理异常过滤程序

2)我们想要应用程序在未处理异常没有发生的情况下也生成报告

3)我们想往错误报告里添加更多信息。


定制报告的一种方式是指出哪些数据块或者文件需要添加到为进程生成的问题报告里。要添加任意数据块,可以调用

HRESULT
WINAPI
WerRegisterMemoryBlock(
    _In_ PVOID pvAddress,
    _In_ DWORD dwSize
    );

通过参数pvAddress 来传入内存块地址,通过dwSize来致命需要保持的数据有多少字节。调用这个函数以后,一旦发生了问题,这个范围内的直接就会保存在小型转储中,可以通过事后调试器(postmortem debugger)来查看这些字节。

可以多次调用WerRegisterMemoryBlock来将多个数据块保存在小型转储中。(minidump)

要添加任意文件到报告可以使用

HRESULT 
WINAPI
WerRegisterFile(
    _In_ PCWSTR pwzFile, 
    _In_ WER_REGISTER_FILE_TYPE regFileType,
    _In_ DWORD dwFlags
    );

通过参数pwszFile传入文件的路径名。如果不提供完整路径,会在当前的工作目录寻找文件。


regFileTypes可以传入一下值


下面两个函数用于移出已经注册的内存块和文件

HRESULT 
WINAPI
WerUnregisterMemoryBlock(
    _In_ PVOID pvAddress
    );

HRESULT 
WINAPI
WerUnregisterFile(
    _In_ PCWSTR pwzFilePath
    );


26.4 问题报告的创建与定制

WER框架通过一些注册表值限制了报告的大小和数目。

HKEY_CURRENT_USER\Software\Microsoft\Windows\Windows Error Reporting



问题报告的创建,定制和提交给WER是按下列步骤调用不同的函数来实现的。


1)调用WerReportCreate来创建一个新问题报告

2)调用WerReportSetParameter零次或多次来设置报告参数

3)调用WerReportAddDump来将小型存储放进报告

4)调用WerReportAddFile零次或多次来将任意文件放进报告

5)调用WerReportSetUIOption来修改一些字符串,当调用WerReportSubmit时,这些字符串可能会在同意对话框中呈现给用户

6)调用WerReportSubmit来提交一个报告,根据不同的标志,Windows可能会将报告放进队列,或者提示用户将报告发送给服务器,或者直接发送报告。

7)调用WerReportCloseHandle来关闭报告


一个定制化的报告的例子

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值