Windows错误报告是更新的Windows XP上Dr.Watson的替代品。它监视故障并收集可以发送到要分析的服务器(如果用户允许)的有用信息。这项功能帮助微软修复了很多错误——由于收到的报告,微软能够对错误进行优先排序(基于最大点击数或其他严重性度量),并解决了很多问题。真正酷的是,任何开发人员都可以为其产品请求报告。来自PDC 2003的Bill Gates:“每当应用程序或系统出现故障时,您就能够将报告发送回Microsoft。我们得到了很多这样的报告,我们已经创建了非常好的数据管理系统来查看这些东西,从而了解哪些驱动程序是不可靠的。我们允许任何在Windows上运行应用程序的人注册并获取与其应用程序相关的报告,而且我们还有winqual.microsoft.com,人们可以在这里完成这项工作。”

以下是WER的工作原理:当进程崩溃时,WER收集数据并将其发送到服务器(如果用户允许;默认情况下,WER请求同意)。对于非Microsoft程序,此服务器是Winqual(Windows质量联机服务)。在服务器端:基于崩溃的参数,创建一个bucket来保存新的错误,或者将报告添加到已经存在的bucket中(这意味着以前有人遇到过这个问题)。开发人员可以分析故障;如果根据收集的数据找不到解决方案,他/她可以请求其他信息(转储、注册表项值等)。此外,他/她还可以添加一条解释失败的消息。当同一类型崩溃的实例发生时,服务器将显示开发人员设置的消息,并在必要时要求提供附加信息。如果开发人员找到一个解决方案,在下一次崩溃时,服务器可以提供解决方案(见下图)。阅读有关错误报告收集和分类的详细信息

在Vista和更高版本上,程序崩溃的用户可以转到“控制面板”->“问题报告和解决方案”(启动wercon.exe),查看机器上发生了什么故障。

在这里,您可以检查解决方案并查看已识别的问题

您可以查看每个问题的参数,并查看对报表进行分类的bucket。

作为开发人员,您可以转到Winqual并注册以接收失败报告。但还有其他方法可以利用WER。您可以将WER配置为将报告发送到您的一个服务器,这样您就可以直接查看它们。例如,假设您有两台要监视的机器。您可以使用System Center Operations Manager(SCOM)和Agentless错误监视(AEM)将所有报告传输到监视服务器,而不是发送到Winqual。您甚至不必使用Active Directory集成和组策略,但可以手动配置WER注册表项来指定CorporateWERServer(使用您喜欢的端口和安全选项)。

另一种利用WER的方法是在本地保存报告。在本文的其余部分中,我假设WER是enables(默认设置)。

正如我所说,WER试图收集尽可能少的数据,并要求更多只有在必要时。但是可以配置此行为。如果需要在每次崩溃时收集转储,可以将HKEY_CURRENT_USER\Software\Microsoft\Windows\Windows Error Reporting\ForceQueue设置为1(或将HKLM\Software\Microsoft\Windows\Windows Error Reporting\ForceQueue设置为1,以全局应用设置)。这将强制生成转储并包含在报表中。报表通常保存在%localAppData%\Microsoft\Windows\WER的两个目录中:ReportArchive(当服务器可用时)或ReportQueue(当服务器不可用时)。从这里,数据被传输到服务器。查看生成的报告内容的另一种方法是使用wercon.exe(如上所述)。如果您想在本地保持数据,只需将服务器设置为一个非现有的机器(HKEY-LoalAlxMault\Studio\\微软\Windows \Windows错误报告\CytAtWiServer=Nosiver Server)。

现在如果你想在不同的情况下生成崩溃的报告呢?可能您正在监视事件日志或某些性能计数器(如CPU或内存),并希望查看违反条件时会发生什么。或者您希望生成的数据不仅仅是转储(例如,您的应用程序有一个要保存的跟踪文件,或者您希望复制事件日志条目等)?好吧,你很幸运,因为WER有你可以使用的API。使用此API,只要满足所需条件,就可以:

  • 使用WerReportCreate创建报表
  • 使用WerReportAddDump进行转储
  • 使用WerReportAddFile添加其他感兴趣的文件
  • 最多设置10个参数,可用于对故障进行分类(故障程序、故障函数、堆栈跟踪,以及您认为有助于调查此问题的任何参数)
  • 关闭并与WerReportSubmit一起提交报告

有一件事你必须记住,那就是WerReportAddDump在进行转储时会一个接一个地挂起线程。这无法确保内存视图的一致性—一个线程可以挂起,然后当下一个线程挂起时,可能会更改内存或造成其他损坏;如果应用程序有很多线程,这尤其麻烦。如果需要一致的视图,您有责任挂起所有线程。另外,最好在进程外调用此函数。
好的,现在您知道了如何使用WER在发生故障时始终生成转储,将报告发送到您指定的服务器或在本地对其进行排队,并生成自定义报告。希望您会发现这些信息对调试和监视与应用程序相关的问题很有用。

最新文章

  1. oracle 中文乱码---查看和修改客户端字符集
  2. db2死锁分析与处理
  3. iOS开发之网络编程--1、NSURLSession的基本使用
  4. 通过java的Runtime.getRuntime()和System.getProperties()来获取系统的信息
  5. 坚持不懈之linux haproxy 配置文件 详情
  6. Java基础之在窗口中绘图——绘制曲线(CurveApplet 1)
  7. Java 炫舞按键功能 DancingPlay (整理)
  8. 分享php中四种webservice实现的简单架构方法及实例(转)
  9. VB.NET的反射机制
  10. Java 实现享元(Flyweight)模式
  11. URL 调度器(URL dispatcher)
  12. PAT (Advanced Level) 1069. The Black Hole of Numbers (20)
  13. java数组去重
  14. NodeJS之微信开发
  15. CentOS安装VLC
  16. Java基础_0304:构造方法
  17. thinkphp5 composer
  18. React native 之android的图标和启动图片
  19. 使用iframe实现同域跨站提交数据
  20. Design and Implementation of a Routing Control Platform阅读笔记

热门文章

  1. C#DataTable使用方法详解
  2. element-UI级联选择器(Cascader)获取label值 ,this.$refs['新组件名'].currentLabels 在2.7版本给移除了,新的解决方法。
  3. 使用GitHub搜索技巧
  4. 《CI/CD 流程以及原理说明》
  5. Springboot 基于的SAP项目环境配置
  6. Vue – 基础学习(1):对生命周期和钩子函的理解
  7. SpringBoot 通过配置禁用swagger
  8. Golang: 打印命令行参数
  9. jieba分词及词频统计小项目
  10. PostgreSQL分区表实现——pg_pathman分区表管理