⾯向开发⼈员的Windows错误报告(WER)
Windows错误报告是更新的Windows XP上Dr.Watson的替代品。它监视故障并收集可以发送到要分析的服务器(如果⽤户允许)的有⽤信息。这项功能帮助微软修复了很多错误——由于收到的报告,微软能够对错误进⾏优先排序(基于最⼤点击数或其他严重性度量),并解决了很多问题。真正酷的是,任何开发⼈员都可以为其产品请求报告。来⾃PDC 2003的Bill Gates:“每当应⽤程序或系统出现故障时,您就能够将报告发送回Microsoft。我们得到了很多这样的报告,我们已经创建了⾮常好的数据管理系统来查看这些东西,从⽽了解哪些驱动程序是不可靠的。我们允许任何在Windows上运⾏应⽤程序的⼈注册并获取与其应⽤程序相关的报告,⽽且我们还有winqual.microsoft,⼈们可以在这⾥完成这项⼯作。”
以下是WER的⼯作原理:当进程崩溃时,WER收集数据并将其发送到服务器(如果⽤户允许;默认情况下,WER请求同意)。对于⾮Microsoft程序,此服务器是Winqual(Windows质量联机服务)。在服务器端:基于崩溃的参数,创建⼀个bucket来保存新的错误,或者将报告添加到已经存在的bucket中(这意味着以前有⼈遇到过这个问题)。开发⼈员可以分析故障;如果根据收集的数据不到解决⽅案,他/她可以请求其他信息(转储、注册表项值等)。此外,他/她还可以添加⼀条解释失败的消息。当同⼀类型崩溃的实例发⽣时,服务器将显⽰开发⼈员设置的消息,并在必要时要求提供附加信息。如果开发⼈员到⼀个解决⽅案,在下⼀次崩溃时,服务器可以提供解决⽅案(见下图)。阅读有关错误报windows开发平台
告收集和分类的详细信息
在Vista和更⾼版本上,程序崩溃的⽤户可以转到“控制⾯板”->“问题报告和解决⽅案”(启动),查看机器上发⽣了什么故障。
在这⾥,您可以检查解决⽅案并查看已识别的问题
您可以查看每个问题的参数,并查看对报表进⾏分类的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(当服务器不可⽤时)。从这⾥,数据被传输到服务器。查看⽣成的报告内容的另⼀种⽅法是使⽤(如上所述)。如果您想在本地保持数据,只需将服务器设置为⼀个⾮现有的
机器(HKEY-LoalAlxMault\Studio\\微软\Windows \Windows错误报告\CytAtWiServer=Nosiver Server)。
现在如果你想在不同的情况下⽣成崩溃的报告呢?可能您正在监视事件⽇志或某些性能计数器(如CPU或内存),并希望查看违反条件时会发⽣什么。或者您希望⽣成的数据不仅仅是转储(例如,您的应⽤程序有⼀个要保存的跟踪⽂件,或者您希望复制事件⽇志条⽬等)?好吧,你很幸运,因为WER有你可以使⽤的API。使⽤此API,只要满⾜所需条件,就可以:
使⽤WerReportCreate创建报表
使⽤WerReportAddDump进⾏转储
使⽤WerReportAddFile添加其他感兴趣的⽂件
最多设置10个参数,可⽤于对故障进⾏分类(故障程序、故障函数、堆栈跟踪,以及您认为有助于调查此问题的任何参数)
关闭并与WerReportSubmit⼀起提交报告
有⼀件事你必须记住,那就是WerReportAddDump在进⾏转储时会⼀个接⼀个地挂起线程。这⽆法确
保内存视图的⼀致性—⼀个线程可以挂起,然后当下⼀个线程挂起时,可能会更改内存或造成其他损坏;如果应⽤程序有很多线程,这尤其⿇烦。如果需要⼀致的视图,您有责任挂起所有线程。另外,最好在进程外调⽤此函数。
好的,现在您知道了如何使⽤WER在发⽣故障时始终⽣成转储,将报告发送到您指定的服务器或在本地对其进⾏排队,并⽣成⾃定义报告。希望您会发现这些信息对调试和监视与应⽤程序相关的问题很有⽤。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。