Windows错误报告 (WER)
工作原理与最佳实践

本文档深入探讨Windows错误报告(WER)系统的核心机制、设计理念和应用场景,为Windows系统与应用程序开发人员提供全面的技术指南与最佳实践。

系统开发人员

了解如何利用WER诊断操作系统级别的错误和崩溃,配置更详细的系统级诊断信息,以及使用专业工具分析错误报告。

应用程序开发人员

掌握如何集成WER捕获应用程序错误,收集特定的应用状态信息,分析错误报告以改进应用质量,以及自定义错误报告行为。

1. Windows错误报告 (WER) 概述

1.1 WER的基本概念、目标与历史

Windows错误报告 (WER) 是一种内建于Windows操作系统中的事件驱动反馈基础设施,其核心目标在于收集Windows在运行过程中检测到的各种问题信息,并将这些信息报告给Microsoft进行分析,最终目的是为用户提供可用的解决方案。WER的设计初衷是帮助包括系统管理员和技术支持人员在内的专业人士更有效地诊断和解决计算机软硬件问题。

Windows XP

WER以代号"Watson"首次引入,标志着Microsoft在错误报告机制上的重要进步,不同于之前主要在用户本地机器上留下内存转储文件的Dr. Watson调试工具。

Windows Vista

WER经历了一次重要升级,引入公共API,使开发者不仅可以报告应用程序的崩溃和挂起,还可以报告其他类型的故障,极大扩展了WER的应用范围。

Windows Vista 之后

WER功能持续增强,甚至能够捕获来自处于异常状态的进程的错误信息,例如当进程发生堆栈耗尽、PEB/TEB数据结构损坏以及堆内存损坏等问题时,WER也能进行报告。

WER的主要特点是能够在用户授权的情况下,通过互联网将应用程序崩溃或停止响应等错误发生后的调试信息(例如内存转储)发送给Microsoft的服务器进行分析。如果Microsoft的服务器分析后发现已知的解决方案,WER会将这些解决方案反馈给用户。

值得一提的是,WER的最初架构师是Kinshuman Kinshumann先生,并且由于其对整个计算行业的深远影响,WER还荣幸地入选了ACM(计算机协会)名人堂。

1.2 WER的核心架构与组件

从架构上看,Windows错误报告 (WER) 并非一个孤立的组件,而是一个分布式的系统。在这个系统中,客户端软件扮演着错误检测和报告的角色。当应用程序或操作系统组件发生错误时,客户端软件会检测到这一情况,并自动生成一个包含错误信息的报告。

WER系统架构图
graph TD A[用户计算机] -->|错误发生| B[WER客户端软件] B -->|生成报告| C[报告标记存储桶ID] C -->|用户授权后发送| D[WER服务] D -->|根据需要请求| E[额外诊断数据] D -->|分析后| F[已知解决方案] F -->|反馈给| A D -->|数据可访问| G[开发者] subgraph Microsoft后端基础设施 D H[60台服务器] I[65TB存储区域网络] J[120TB存储原始CAB文件] end style A fill:#f9f9f9,stroke:#333,stroke-width:1px style B fill:#d4e6f1,stroke:#333,stroke-width:1px style C fill:#d4e6f1,stroke:#333,stroke-width:1px style D fill:#5499c7,stroke:#333,stroke-width:1px,color:#fff style E fill:#d4e6f1,stroke:#333,stroke-width:1px style F fill:#d4e6f1,stroke:#333,stroke-width:1px style G fill:#f9f9f9,stroke:#333,stroke-width:1px style H fill:#aed6f1,stroke:#333,stroke-width:1px style I fill:#aed6f1,stroke:#333,stroke-width:1px style J fill:#aed6f1,stroke:#333,stroke-width:1px

WER服务是整个错误报告系统的核心。它接收并记录来自各个客户端的错误报告。随后,WER服务会根据其对特定错误的已知信息进行判断,可能会主动向客户端请求提供额外的诊断数据,或者直接引导客户端用户获取已知的解决方案。值得注意的是,开发者也可以通过访问WER服务来检索特定错误报告的详细数据,并进行基于大量错误报告统计信息的调试分析。

为了支持如此庞大的错误报告处理量,WER服务在后端部署了相当规模的基础设施。据统计,该服务拥有大约60台服务器,这些服务器连接到一个容量高达65TB的存储区域网络 (SAN),用于存储所有收集到的错误报告数据库。此外,还有一个容量为120TB的SAN,专门用于存储长达6个月的原始CAB文件,这些CAB文件包含了更详细的错误诊断数据。WER服务的这种配置使其具备了每天接收和处理超过1亿份错误报告的能力,即使在发生大规模的全球性事件(例如互联网蠕虫病毒爆发)时,也能保证服务的稳定运行。

在用户的本地计算机上,WER相关的文件通常存储在两个主要的目录下:%ProgramData%\Microsoft\Windows\WER\%UserProfile%\AppData\Local\Microsoft\Windows\WER\。前者通常包含由系统级别进程或服务生成的错误报告,而后者则存储了用户会话中应用程序产生的错误报告。

1.3 WER的工作流程:错误检测、信息收集与报告

当用户的计算机上运行的应用程序发生崩溃或停止响应时,Windows错误报告 (WER) 系统会自动介入,开始收集相关信息,并向用户提供将错误发生后的调试信息(通常是内存转储文件)发送给Microsoft进行分析的选项。WER在信息收集和发送过程中非常注重用户的隐私,因此,在未获得用户的明确同意之前,不会主动发送任何数据到Microsoft的服务器。

WER工作流程
sequenceDiagram participant U as 用户应用程序 participant W as WerFault.exe participant S as WerSvc服务 participant MS as Microsoft服务器 Note over U: 应用程序崩溃或停止响应 U->>W: 触发错误报告 W->>S: 检查服务状态 alt 服务未启动 W->>S: 启动服务 end W->>U: 收集崩溃信息 W->>W: 生成报告并分类(存储桶) W->>U: 显示错误报告对话框 alt 用户同意发送 W->>MS: 发送错误报告 MS->>MS: 分析错误报告 alt 有已知解决方案 MS->>W: 返回解决方案 W->>U: 显示解决方案 else 需要更多信息 MS->>W: 请求额外诊断数据 W->>U: 请求用户授权 alt 用户同意 W->>MS: 发送额外数据 end end end

在WER的整个工作流程中,WerFault.exe进程扮演着至关重要的角色,它通常负责实际的崩溃报告操作。当一个程序崩溃时,WER首先会检查名为WerSvc的Windows错误报告服务是否正在后台运行。如果该服务尚未启动,WER会首先启动它,因为WerSvc是WER功能正常运行的基础。

随后,WerFault.exe进程会与发生崩溃的进程进行通信,收集关于崩溃的各种信息,包括引发崩溃的异常类型以及程序在崩溃时的内存状态。为了保护用户的安全和隐私,并减小错误报告的大小,WER在收集内存转储时通常只会包含与崩溃进程直接相关的一小部分内存数据,而不是整个计算机的内存快照。

为了更有效地管理和分析大量的错误报告,WER采用了一种称为"存储桶 (buckets)"的机制来对问题进行分类。每个存储桶都通过一系列标准来区分不同的问题,这些标准包括应用程序的名称、版本、构建日期,发生错误的模块的名称、版本、构建日期,以及操作系统报告的异常代码或系统错误代码,以及模块代码的偏移量等信息。理想情况下,WER的设计目标是让每一个存储桶都只包含由一个唯一的根本原因所导致的崩溃报告,但这在实际情况中并不总是能够完全实现。

值得一提的是,软件和硬件的制造商可以通过Microsoft提供的Windows Dev Center硬件和桌面仪表板(以前称为Winqual)程序来访问与其自身产品相关的错误报告数据。为了确保这些敏感的错误报告数据只发送给负责相应产品的工程师,Microsoft要求这些感兴趣的供应商必须获得由VeriSign或DigiCert颁发的Class 3数字证书。

2. WER如何捕获和报告错误信息

2.1 错误事件的触发与分类

Windows错误报告 (WER) 的主要功能是捕获在Windows操作系统上运行的应用程序发生崩溃或停止响应时产生的信息。随着Windows版本的更新,WER的能力也得到了显著提升。例如,Windows Vista相对于之前的版本,对WER进行了重要的改进,使其不仅能够报告传统的应用程序崩溃和挂起,还能处理更广泛的故障类型,包括那些发生在系统底层或进程内部的异常情况,例如堆栈耗尽、PEB/TEB数据结构损坏以及堆内存损坏等。

WER文件的主要分类
  • 应用程序崩溃: 文件名前缀通常为 AppCrash_,当用户模式的应用程序发生崩溃时创建。
  • 应用程序挂起: 文件名前缀为 AppHang_,当用户模式的应用程序进入挂起状态时创建。
  • 内核崩溃: 文件名前缀为 Kernel_,当发生内核级别的崩溃时创建。

为了有效地管理和分析数量庞大的错误报告,WER采用了"存储桶 (buckets)"的概念来对问题进行分类。这种分类机制的核心思想是将具有相同根本原因的崩溃报告分组在一起,从而方便开发者识别和解决共性问题。

WER会根据一系列预定义的标准来对错误进行分类,这些标准包括但不限于发生错误的应用程序的名称、版本、构建日期,导致错误的模块(例如DLL文件)的名称、版本、构建日期,以及操作系统报告的异常代码或系统错误代码,以及模块代码中的具体偏移量等。通过这些详细的分类信息,WER能够相对准确地将不同的错误事件归类到相应的存储桶中。

2.2 诊断数据的收集范围与类型

Windows错误报告 (WER) 在捕获到错误事件后,会收集一系列相关的诊断数据,以便Microsoft和软件开发者能够理解问题的来龙去脉并找到解决方案。这些数据的收集范围和类型非常广泛,旨在提供多层次的故障信息。

基本信息
  • 应用程序的名称和完整文件路径
  • 应用程序在运行时加载的所有模块列表
  • 应用程序的元数据(版本号、名称等)
  • 操作系统的元数据(版本、架构等)
  • 错误发生的时间
内存转储
  • 程序崩溃时正在调用的函数信息
  • 程序中变量的实际数值
  • 堆转储(内存中加载的数据快照)
  • 堆栈信息(函数调用序列)
  • 线程状态信息

其中一种关键的诊断数据是应用程序的名称以及在发生错误时加载的模块列表。此外,WER还会收集堆转储 (heap dump),这是一个在应用程序崩溃或挂起时,其内存中加载的数据的快照。通过分析堆转储,开发者可以了解程序在崩溃瞬间的状态,包括变量的值、正在执行的代码以及内存的分配情况,这对于定位内存相关的错误(例如内存泄漏、空指针引用等)非常有帮助。

为了更好地对错误进行分类和管理,WER还会生成一个称为存储桶ID的标识符。这个ID是由Windows系统根据发生错误的具体情况自动计算出来的,它试图基于崩溃的根本原因对不同的崩溃事件进行分组。例如,如果某个特定的错误反复发生,即使每次发生的程序代码位置可能不同,WER也可能会将它们归类到同一个存储桶中,从而提示开发者这些崩溃可能具有相同的潜在原因。

对于那些难以通过初步报告进行调试的问题,WER还具备收集额外客户端数据的能力。这些额外数据可能包括更全面的内存转储,例如完整的内存转储而不是minidump,还可以收集计算机的环境数据(例如操作系统配置、硬件信息等)、详细的日志文件以及应用程序的配置设置等。这些更深入的信息可以帮助开发者在遇到复杂或难以重现的bug时,获得更全面的问题视图。

2.3 错误报告的生成、格式与存储

当Windows操作系统或其上运行的应用程序发生错误时,客户端软件会立即响应并开始生成错误报告。这个报告随后会被发送给Windows错误报告 (WER) 服务进行处理。

在用户的本地计算机上,这些错误报告通常会存储在特定的目录中。主要的存储位置包括:

%ProgramData%\Microsoft\Windows\WER\ReportArchive\

用于存储那些已经发送给Microsoft或本地存档的错误报告

%UserProfile%\AppData\Local\Microsoft\Windows\WER\ReportQueue\

用于存放那些正在等待上传到Microsoft服务器的错误报告

错误报告的主要文件格式是 .WER 文件。这是一个包含结构化文本信息的文件,记录了错误事件的各种细节,例如发生错误的时间、应用程序的名称和版本、导致错误的模块、错误代码以及相关的堆栈信息等。开发者可以通过文本编辑器或专门的分析工具来查看 .WER 文件的内容。

除了 .WER 文件之外,错误报告有时还会被封装在 CAB 文件中。CAB 文件是一种压缩格式,可以包含多个相关的文件,例如 .WER 文件、minidump 文件(包含程序崩溃时的部分内存快照)、以及其他可能有助于诊断问题的文件(例如相关的日志文件或配置文件)。使用 CAB 文件可以方便地将一个完整的错误报告打包在一起进行传输和存储。

2.4 用户同意机制与隐私考量

Windows错误报告 (WER) 系统在设计之初就非常重视用户的隐私和对错误报告过程的控制。因此,在将任何错误报告发送给Microsoft之前,WER通常会主动提示用户是否同意进行此操作。这个提示通常以对话框的形式出现,告知用户应用程序发生了错误,并询问用户是否希望将详细信息发送给Microsoft以帮助解决问题。

隐私保护措施

  • WER在未获得用户明确同意前不会发送任何数据
  • Microsoft声明不会使用个人数据识别用户身份
  • 从Windows 8开始,WER采用TLS加密协议保护传输中的数据
  • 用户可以控制发送哪些信息或完全禁用错误报告功能

用户可以选择发送包含内存转储等调试信息的报告。内存转储包含了程序在崩溃时的部分或全部内存内容,对于开发者来说是非常宝贵的诊断信息。然而,Microsoft也承认,WER在编译并发送回Microsoft的100-200 KB大小的"minidumps"(小型内存转储)中,可能包含用户的个人身份信息。尽管如此,Microsoft声明,即使用户的个人数据被发送到Microsoft,这些数据也不会被用于识别用户的身份,而是会遵循Microsoft的隐私策略进行处理。

为了进一步保护用户的数据安全,从Windows 8操作系统开始,WER在发送错误报告数据时采用了TLS(传输层安全)加密协议。这意味着在用户的计算机和Microsoft的服务器之间传输的错误报告数据是经过加密的,可以防止第三方在传输过程中窃取或篡改这些信息。

2.5 WER向Microsoft及开发者的报告流程

当用户的计算机上发生错误并且用户同意发送报告时,Windows错误报告 (WER) 系统会将这些错误报告通过互联网安全地发送到Microsoft的服务器进行分析。在Microsoft的后端,专业的团队和自动化系统会对接收到的报告进行深入的分析。如果分析结果表明该错误是一个已知的问题,并且已经存在相应的解决方案(例如补丁程序、更新或临时的解决方法),WER系统会将这些解决方案通过错误报告响应机制发送回用户的计算机。用户通常会收到通知,告知他们可以采取哪些步骤来解决问题。

WER报告流程
graph TD A[用户计算机] -->|错误报告发送| B[Microsoft WER服务] B -->|聚合与分析| C[报告数据库] B -->|已知解决方案| A C -->|访问产品相关报告| D[验证身份的开发者] C -->|分析最频发问题| E[Microsoft开发团队] E -->|改进Windows质量| F[Windows更新] F -->|提供修复| A C -.->|最少3个相同崩溃| D style A fill:#f9f9f9,stroke:#333,stroke-width:1px style B fill:#5499c7,stroke:#333,stroke-width:1px,color:#fff style C fill:#aed6f1,stroke:#333,stroke-width:1px style D fill:#f9f9f9,stroke:#333,stroke-width:1px style E fill:#d4e6f1,stroke:#333,stroke-width:1px style F fill:#d4e6f1,stroke:#333,stroke-width:1px

除了直接向用户提供解决方案外,WER还为软件和硬件制造商提供了一个重要的反馈渠道。这些制造商可以通过Microsoft提供的Windows Dev Center硬件和桌面仪表板(以前称为Winqual)程序,访问与其自身产品相关的错误报告数据。为了确保这些错误报告数据只发送给负责相应产品的工程师,Microsoft对访问权限进行了严格的控制。他们要求所有希望获取其产品错误报告的供应商必须获得由VeriSign或DigiCert颁发的Class 3数字证书,以此来验证其身份并确保数据的安全性。

在Microsoft的服务器端,WER服务会对来自全球数百万用户的错误报告进行聚合和诊断。通过对大量的报告进行分析,Microsoft可以了解哪些错误是最常见、影响最广泛的,从而优先解决这些问题,并改进Windows操作系统本身的质量和稳定性。

值得注意的是,WER系统目前仅向开发者显示那些已经观察到至少三个或更多相同崩溃事件的问题。这有助于过滤掉一些偶发性的、不常见的问题,让开发者能够更专注于解决那些真正影响到大量用户的bug。

3. Windows系统开发人员使用WER的最佳实践

3.1 利用WER进行操作系统级别错误和崩溃的诊断与解决

对于Windows系统开发人员而言,Windows错误报告 (WER) 提供了一个宝贵的资源,可以有效地诊断和解决操作系统组件中出现的各种错误和崩溃问题。通过深入分析WER收集到的报告,系统开发人员能够识别出导致操作系统不稳定或功能异常的根本原因,并采取相应的修复措施。

统计数据分析

分析错误发生的频率和趋势,识别最常见问题,确定修复优先级,验证修复的有效性。

渐进式数据收集

对大多数错误仅收集基本信息,对复杂问题按需收集更详细数据,平衡诊断需求与用户体验。

自动错误诊断

自动分析接收的错误报告,与已知错误模式匹配,自动引导用户至可用修复程序。

WER收集的统计数据对于系统开发团队来说尤其重要。这些数据可以帮助他们清晰地了解哪些错误是最频繁发生的,哪些错误对用户的影响最大,从而能够更明智地确定开发和修复工作的优先级。通过分析错误发生的趋势,开发人员还可以及时发现新出现的或正在变得越来越普遍的问题,从而在这些问题影响到更广泛的用户之前采取行动。此外,WER提供的统计信息还可以帮助开发人员验证他们所做的修复是否有效,以及是否引入了新的问题。

WER采用了一种渐进式的数据收集方法,这意味着对于大多数错误报告,WER会尽量减少对用户计算机性能的影响,只收集必要的基本信息。然而,当遇到一些难以通过初步报告进行诊断的复杂问题时,系统开发人员可以请求WER在未来的错误报告中收集更详细的信息,例如更广泛的内存转储、更全面的环境数据、相关的系统和应用程序日志文件以及详细的程序设置等。这种按需收集详细信息的能力,使得开发人员能够在不给大多数用户带来额外负担的情况下,获取解决疑难问题所需的关键数据。

3.2 配置WER以收集更详细的系统级诊断信息

Windows系统开发人员可以根据具体的诊断需求,对Windows错误报告 (WER) 进行细致的配置,以便收集更详细的系统级诊断信息。这可以通过多种方式实现,包括使用组策略编辑器和直接修改注册表。

通过组策略配置WER

使用组策略管理编辑器 (gpmc.msc) 配置以下选项:

  • 启用/禁用WER: "计算机配置"->"管理模板"->"系统"->"Internet通信管理"下的"关闭Windows错误报告"策略
  • 诊断数据收集级别: 配置"允许诊断数据"或"允许遥测"策略
  • 网络终结点: 配置允许诊断数据收集的网络终结点
  • 数据量控制: 设置"限制转储收集"和"限制诊断日志收集"策略
通过注册表配置WER

修改以下注册表项的值:

  • 主要位置:
  • HKEY_CURRENT_USER\Software\Microsoft\Windows\Windows Error Reporting\
  • HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Windows Error Reporting\
  • 常用值:
  • Disabled (REG_DWORD): 设为1禁用WER,设为0启用
  • DontShowUI (REG_DWORD): 设为1不显示UI,设为0显示
  • BypassDataThrottling (REG_DWORD): 设为1禁用数据旁路限制

使用LocalDumps配置本地转储

LocalDumps是注册表中的一个关键子项,用于配置在应用程序崩溃后在本地收集用户模式的完整内存转储文件:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\

为特定应用程序创建子项(例如MyApplication.exe),并设置以下键值:

  • DumpFolder (REG_EXPAND_SZ): 指定转储文件存储路径
  • DumpType (REG_DWORD): 指定转储类型(1=minidump,2=full dump)
  • DumpCount (REG_DWORD): 设置保留的最大转储文件数量

对于部署了Windows Server Failover Clusters的环境,WER同样可以用于故障排除。系统开发人员可以配置集群中的每个服务器节点启用特定的事件通道,以便收集更丰富的诊断日志。此外,还可以使用DumpLogQuery属性来指定需要收集的日志类型。

WER报告本身存储在%ProgramData%\Microsoft\Windows\WER\目录下,其中ReportsQueue文件夹包含等待上传的报告,而ReportsArchive文件夹则存储了已经上传的报告。通过分析这些WER报告以及相关的事件日志,系统开发人员可以诊断集群中出现的各种问题,例如物理磁盘故障等。

3.3 使用WinDBG等工具分析操作系统组件的错误报告

Windows错误报告 (WER) 在收集到操作系统组件的错误信息后,通常会生成相应的报告文件,例如内存转储文件。为了深入分析这些报告,Windows系统开发人员经常需要借助强大的调试工具,其中最常用的就是Microsoft提供的WinDBG。WinDBG是一款功能全面的调试器,可以用于分析内核模式和用户模式的转储文件,帮助开发者理解系统崩溃或异常发生时的状态。

使用WinDBG分析崩溃转储的基本步骤
  1. 加载转储文件

    打开WinDBG,通过"文件"菜单选择"打开崩溃转储"并加载目标.dmp文件。

  2. 配置符号路径

    设置符号文件路径,指向Microsoft的符号服务器和本地符号路径。例如:

    srv*https://msdl.microsoft.com/download/symbols
  3. 执行自动分析

    使用!analyze -v命令进行初步的自动分析,识别崩溃的根本原因。

  4. 分析堆栈跟踪

    检查堆栈跟踪以理解崩溃发生时的代码执行路径,找到可能的错误源。

  5. 检查故障模块

    识别标记为"FAULTING_MODULE"或在堆栈顶部的模块,它们可能是导致崩溃的直接原因。

除了分析堆栈跟踪,检查故障模块的名称也非常重要。对于操作系统级别的崩溃,故障模块很可能是一个设备驱动程序或某个核心的系统组件。通过识别故障模块,开发人员可以缩小问题排查的范围,例如针对特定的驱动程序进行更新、回滚或更深入的分析。

在某些情况下,系统可能会遇到不同的蓝屏死机 (BSOD) 代码。这时,交叉引用不同崩溃转储中提到的驱动程序或模块可能会有所帮助。如果相同的驱动程序或模块在多个崩溃报告中出现,这可能表明该组件存在潜在的问题。

此外,系统开发人员还可以结合使用Windows事件查看器来分析WER报告。事件查看器记录了系统和应用程序的各种事件,包括错误、警告和信息性消息。通过查看崩溃发生时间附近的系统日志,可以获取更多上下文信息,例如是否有相关的硬件或驱动程序错误发生,这有助于更全面地理解崩溃的原因。

3.4 通过WER监控系统稳定性与潜在问题

Windows错误报告 (WER) 不仅在系统发生崩溃或错误后提供诊断信息,还可以作为一种有力的工具,帮助系统开发人员持续监控操作系统的整体稳定性并主动识别潜在的问题。通过对WER收集到的错误报告进行分析,开发团队可以了解系统崩溃和错误的发生频率、模式以及影响范围,从而对系统的健康状况有一个全面的认识。

趋势分析

通过长期跟踪WER报告数据,开发人员可以:

  • 观察系统稳定性的变化趋势
  • 评估新更新或驱动程序对系统稳定性的影响
  • 发现错误发生频率的变化
  • 识别新出现的系统问题
集成监控

WER可以与其他监控工具集成,提供更全面的视图:

  • 结合性能监控数据分析
  • 与事件日志信息关联
  • 整合到系统健康状况仪表板
  • 设置自动警报系统识别关键问题

WER报告可以提供关于系统在不同时间段内发生的崩溃次数、错误类型以及相关的组件信息。通过长期跟踪这些数据,开发人员可以观察系统稳定性的变化趋势,例如在发布新的更新或驱动程序后,崩溃率是否有所上升,或者是否存在某些特定的错误变得更加频繁。这种趋势分析有助于开发团队及时发现并调查可能由新引入的代码或配置更改引起的问题。

此外,通过分析WER收集的大量错误统计数据,开发人员可以主动识别新出现的或频繁发生的系统问题。例如,如果某个特定的错误开始在越来越多的用户报告中出现,这可能预示着系统中存在一个潜在的bug,需要开发团队尽快介入调查和修复。WER的存储桶机制可以将具有相似特征的错误报告分组在一起,这使得识别共性问题变得更加容易。

4. Windows应用程序开发人员使用WER的最佳实践

4.1 集成WER以捕获应用程序错误、异常和崩溃

对于Windows应用程序开发人员而言,Windows错误报告 (WER) 提供了一种便捷且强大的机制来捕获应用程序中发生的各种错误、异常和崩溃。值得注意的是,从Windows Vista操作系统开始,Windows已经默认提供了对应用程序崩溃、无响应以及内核故障的错误报告功能,这意味着开发者通常无需对自己的应用程序进行额外的代码修改,WER就能自动捕获这些类型的故障信息。

自动捕获的错误类型

  • 应用程序崩溃(由未处理的异常导致)
  • 应用程序无响应(挂起)
  • 内核故障(影响应用程序运行的系统级错误)

然而,在某些情况下,应用程序可能需要报告一些与崩溃、无响应或内核故障无关的特定问题。这时,开发者可以利用WER提供的API来生成这些应用程序特定的错误报告,并将它们发送给Microsoft进行分析。例如,应用程序可能在执行某个特定操作时遇到逻辑错误,但并没有导致程序崩溃。开发者可以使用WER API来创建一个包含该错误详细信息的报告。

由于Windows操作系统会自动处理未捕获的异常并生成错误报告,因此,应用程序通常应该避免自行处理那些会导致程序致命退出的异常。如果应用程序尝试捕获并处理这些致命异常,可能会干扰WER的正常工作,导致重要的诊断信息丢失。

对于需要更精细地控制错误报告内容的开发者,WER API提供了一系列函数,允许应用程序自定义发送给Microsoft的报告内容。例如,开发者可以注册特定的文件(例如日志文件、配置文件)和内存块,以便在错误报告中包含这些额外的信息。这些自定义信息可以为诊断特定的应用程序问题提供宝贵的上下文。

4.2 使用WER API和工具收集特定的应用程序状态和上下文信息

为了更有效地诊断和解决应用程序中出现的问题,Windows错误报告 (WER) 提供了一系列API和工具,供应用程序开发人员收集特定的应用程序状态和上下文信息,从而增强错误报告的价值。

WER API关键函数

文件和内存注册

  • WerRegisterFile: 注册文件到错误报告
  • WerRegisterMemoryBlock: 注册内存块到错误报告
  • WerSetFlags: 设置WER行为标志

自定义报告创建

  • WerReportCreate: 创建新的错误报告
  • WerReportSetParameter: 设置报告参数
  • WerReportAddFile: 添加文件到报告
  • WerReportAddDump: 添加内存转储到报告
  • WerReportSubmit: 提交错误报告

元数据注册

  • WerRegisterCustomMetadata: 注册键/值对形式的自定义元数据到报告中

开发者可以使用诸如WerRegisterFile、WerRegisterMemoryBlock和WerSetFlags等WER API函数,来明确告知WER在创建错误报告时,需要包含哪些特定的文件(例如应用程序的配置文件、用户操作日志)以及哪些内存区域的数据。这些函数允许开发者将那些对于理解错误发生时的应用程序状态至关重要的信息添加到报告中。

对于那些并非导致应用程序崩溃或无响应的非致命错误条件,应用程序可以使用WerReportCreate函数创建一个自定义的错误报告,然后使用WerReportSetParameter函数设置报告的参数(例如错误代码、模块名称),使用WerReportAddFile函数添加相关的文件,并使用WerReportAddDump函数(如果需要)添加一个minidump文件到报告中。最后,调用WerReportSubmit函数将该报告发送给WER服务。这种方式允许开发者主动报告应用程序中发生的异常情况,即使这些异常并没有导致程序立即崩溃。

此外,WerRegisterCustomMetadata函数提供了一个非常有用的功能,允许应用程序注册特定的元数据(以键/值字符串的形式)以便包含在WER错误报告中。开发者可以利用这个函数来记录应用程序在发生错误时的关键内部状态信息,例如当前的用户操作、正在处理的数据、特定的配置标志等等。这些自定义元数据可以为诊断问题提供更丰富的上下文,帮助开发者更好地理解错误发生时的具体场景。

第三方工具推荐

AppCrashView是一款免费的小工具,它可以显示系统中发生的所有应用程序崩溃的详细信息,这些信息是从WER创建的.wer文件中提取的。开发者可以使用这款工具来查看本地计算机上发生的应用程序崩溃报告,了解崩溃的时间、应用程序名称、故障模块等基本信息,并查看报告的详细内容。

4.3 分析应用程序错误报告以改进应用程序质量

分析应用程序错误报告是Windows应用程序开发过程中至关重要的一环,它可以帮助开发者深入了解用户在使用应用程序时遇到的问题,从而有针对性地改进应用程序的质量和稳定性。Windows错误报告 (WER) 系统为开发者提供了多种途径来访问和分析这些报告。

应用程序错误分析流程
graph TD A[收集用户错误报告] -->|通过Windows Dev Center访问| B[查看错误统计信息] B -->|按存储桶ID分组| C[识别频繁发生的崩溃] B -->|按影响范围排序| D[确定优先修复的问题] C --> E[深入分析特定崩溃] D --> E E -->|使用调试器加载| F[分析minidump文件] F -->|查看堆栈跟踪| G[定位错误代码位置] G --> H[实施修复] H --> I[验证解决方案] I -->|发布更新| J[监控修复效果] style A fill:#f9f9f9,stroke:#333,stroke-width:1px style B fill:#d4e6f1,stroke:#333,stroke-width:1px style C fill:#d4e6f1,stroke:#333,stroke-width:1px style D fill:#d4e6f1,stroke:#333,stroke-width:1px style E fill:#5499c7,stroke:#333,stroke-width:1px,color:#fff style F fill:#5499c7,stroke:#333,stroke-width:1px,color:#fff style G fill:#5499c7,stroke:#333,stroke-width:1px,color:#fff style H fill:#aed6f1,stroke:#333,stroke-width:1px style I fill:#aed6f1,stroke:#333,stroke-width:1px style J fill:#aed6f1,stroke:#333,stroke-width:1px

开发者可以通过Microsoft提供的Windows Dev Center硬件和桌面仪表板(以前称为Winqual)来访问由用户提交的应用程序错误报告。在这个平台上,开发者可以查看其应用程序的崩溃和错误统计信息,了解问题的发生频率、影响范围以及用户反馈等信息。这些数据可以帮助开发者识别应用程序中存在的常见问题和潜在的bug。

在WER报告中,存储桶ID是一个非常有用的信息。它用于标识具有相似特征的崩溃事件。通过分析报告中的存储桶ID,开发者可以识别出重复发生的崩溃,并尝试确定这些崩溃的根本原因。如果多个用户报告了具有相同存储桶ID的崩溃,这可能表明应用程序中存在一个比较普遍的问题,需要优先进行修复。

当需要更深入地分析某个特定的崩溃报告时,开发者可以使用诸如Visual Studio等调试器来加载报告中包含的minidump文件。Minidump文件包含了程序崩溃时的部分内存快照和线程信息,开发者可以通过调试器查看崩溃时的代码执行状态、变量值以及调用堆栈等信息,从而帮助他们识别导致崩溃的具体原因。

错误报告分析关键指标

  • 崩溃频率: 特定崩溃在一定时间内发生的次数,帮助确定问题的普遍性。
  • 影响用户数: 遇到特定崩溃的用户数量,反映问题的影响范围。
  • 复现率: 特定场景下崩溃发生的概率,帮助评估问题的严重性。
  • 首次出现时间: 问题首次被报告的时间,有助于确定引入问题的版本或更改。
  • 环境分布: 崩溃在不同操作系统版本、硬件配置等环境中的分布情况,帮助定位环境相关问题。

总而言之,WER为应用程序开发者提供了一个强大的反馈机制,使他们能够了解用户在使用其应用程序时遇到的问题。通过定期地访问和分析这些错误报告,特别是关注重复发生的崩溃和具有相同存储桶ID的事件,开发者可以识别应用程序中存在的关键问题,并有针对性地进行修复和改进,从而显著提升应用程序的整体质量和用户体验。

4.4 自定义应用程序的错误报告行为

Windows错误报告 (WER) 系统不仅提供了默认的错误报告机制,还允许应用程序开发人员根据自身的需求自定义应用程序的错误报告行为,以实现更灵活和精细的错误处理和诊断。

临时禁用错误报告

在应用程序的开发或内部测试阶段,有时需要暂时阻止生成WER报告:

  • 使用WerAddExcludedApplication函数将应用程序添加到WER排除列表
  • 测试完成后,使用WerRemoveExcludedApplication函数重新启用报告功能
  • 适用于需要自定义错误处理的开发和测试环境
应用程序恢复和重启

利用应用程序恢复和重启功能提升用户体验:

  • 在应用程序崩溃前尝试保存当前数据和状态
  • 配置崩溃后自动重启应用程序,减少用户中断
  • 注册回调函数实现自定义恢复和重启逻辑
  • 提供友好的恢复界面,增强用户信任感

配置本地存储完整转储文件

对于需要进行更深入错误分析的场景,开发者可以配置WER在应用程序发生崩溃时,在本地存储完整的内存转储文件:

  1. 修改注册表中的LocalDumps相关设置
  2. 指定转储文件的存储路径和类型(完整转储提供更全面的信息)
  3. 设置要保留的转储文件数量,避免占用过多存储空间
  4. 这些本地转储文件对于开发团队内部的错误分析特别有价值

总而言之,WER提供了相当大的灵活性,允许应用程序开发人员根据具体的开发、测试和发布需求,自定义应用程序的错误报告行为。通过合理地使用WER提供的API和配置选项,开发者可以更好地控制错误处理和诊断过程,从而提高应用程序的可靠性和用户满意度。

5. WER的配置选项和自定义功能

5.1 系统级配置选项

Windows错误报告 (WER) 提供了丰富的系统级配置选项,允许管理员和高级用户根据需求调整WER的行为。这些配置可以通过组策略和直接修改注册表来实现。

5.1.1 通过组策略配置WER

组策略是一种强大的管理工具,特别适用于企业环境,可以用来集中配置和管理域内计算机的操作系统设置,包括WER的相关选项。通过组策略管理编辑器 (gpmc.msc),管理员可以找到与WER相关的策略设置。

关键组策略设置路径

  • 计算机配置 -> 策略 -> 管理模板 -> 系统 -> Internet 通信管理 -> Internet 通信设置
  • 计算机配置 -> 策略 -> 管理模板 -> Windows 组件 -> Windows 错误报告
  • 计算机配置 -> 策略 -> 管理模板 -> Windows 组件 -> 数据收集和预览版本

5.1.2 通过注册表配置WER

除了组策略,Windows错误报告 (WER) 的许多设置也可以通过直接修改注册表来实现。WER的主要配置信息存储在注册表的以下路径:

HKEY_CURRENT_USER\Software\Microsoft\Windows\Windows Error Reporting\ HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Windows Error Reporting\

在这些注册表项中,存在着许多可以自定义WER行为的值。以下是一些常用的注册表值:

注册表值名称 类型 功能 可能的设置
BypassDataThrottling REG_DWORD 控制是否禁用数据旁路限制 0 = 启用限制,1 = 禁用限制
ConfigureArchive REG_DWORD 配置WER存档行为 1 = 只存档参数,2 = 存档所有数据
Consent\DefaultConsent REG_DWORD 设置默认同意级别 1 = 始终询问,4 = 自动发送
Disabled REG_DWORD 启用/禁用WER功能 0 = 启用,1 = 禁用
DontShowUI REG_DWORD 控制是否显示WER界面 0 = 显示,1 = 不显示

5.1.3 使用LocalDumps配置本地转储

LocalDumps是Windows注册表中的一个关键子项,位于HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\路径下,专门用于配置在应用程序崩溃后在本地计算机上收集用户模式的完整内存转储文件。

LocalDumps关键设置

  • 创建应用程序子项: 在LocalDumps下创建以应用程序可执行文件名命名的子项
  • DumpFolder (REG_EXPAND_SZ): 指定转储文件存储路径
  • DumpType (REG_DWORD): 指定转储类型(1=minidump,2=full dump)
  • DumpCount (REG_DWORD): 设置要保留的最大转储文件数量

5.2 应用程序级配置选项

5.2.1 使用WER API进行配置

Windows错误报告 (WER) 提供了一组丰富的API函数,应用程序可以直接调用这些函数来配置自身的错误报告行为。例如,应用程序可以使用WerSetFlags和WerGetFlags函数来设置和检索当前进程的基本WER设置。这些标志可以控制报告的某些方面,例如是否允许发送额外的诊断数据。

更重要的是,应用程序可以使用注册函数来告知WER在发生错误时需要包含哪些特定的文件和内存块到错误报告中。例如,WerRegisterFile函数允许应用程序注册一个或多个需要在错误报告中包含的文件,例如日志文件或配置文件。WerRegisterMemoryBlock函数则允许应用程序注册一块或多块内存区域,WER会在生成错误报告时将这些内存区域的内容也包含进去。

WER API 示例代码
// 注册一个日志文件到WER报告
HRESULT hr = WerRegisterFile(
    L"C:\\Logs\\AppLog.txt",    // 文件路径
    WerRegFileTypeOther,        // 文件类型
    WER_FILE_ANONYMOUS_DATA     // 文件标志(匿名数据)
);

// 注册一块内存区域到WER报告
if (pAppState != NULL)
{
    hr = WerRegisterMemoryBlock(
        pAppState,                  // 内存块指针
        sizeof(APP_STATE)           // 内存块大小
    );
}

// 创建自定义错误报告
HREPORT hReport = NULL;
hr = WerReportCreate(
    L"App_CustomError",           // 事件类型
    WerReportApplicationCrash,    // 报告类型
    NULL,                         // 报告参数
    &hReport                      // 报告句柄
);

// 设置报告参数
if (SUCCEEDED(hr))
{
    WerReportSetParameter(hReport, 0, L"ErrorCode", L"0x8007000E");
    WerReportSetParameter(hReport, 1, L"ErrorDesc", L"内存不足");
    
    // 添加文件到报告
    WerReportAddFile(
        hReport,
        L"C:\\Logs\\AppLog.txt",
        WerFileTypeOther,
        WER_FILE_ANONYMOUS_DATA
    );
    
    // 提交报告
    WER_SUBMIT_RESULT result;
    hr = WerReportSubmit(
        hReport,          // 报告句柄
        WerConsentAlwaysPrompt,  // 同意类型
        WER_SUBMIT_QUEUE,        // 提交标志
        &result                  // 提交结果
    );
}
                        

5.2.2 排除特定应用程序的错误报告

在某些特定的情况下,应用程序开发人员可能希望将自己的应用程序从Windows错误报告 (WER) 的处理流程中排除出去。例如,在开发和测试阶段,开发者可能更倾向于使用自己的内部错误处理和报告机制。

WER提供了WerAddExcludedApplication函数,应用程序可以调用这个函数将其自身的可执行文件名添加到WER的排除列表中。一旦应用程序被添加到排除列表,WER将不会为该应用程序创建或发送任何错误报告。

如果后续需要重新启用WER对该应用程序的错误报告功能,可以使用WerRemoveExcludedApplication函数将应用程序从排除列表中移除。这个函数会将指定的可执行文件名从排除列表中删除,从而恢复WER对该应用程序的错误监控和报告。

5.3 自定义错误报告对话框

虽然Windows错误报告 (WER) 系统提供了默认的错误报告对话框,但在某些高级场景下,开发者可能希望自定义应用程序的错误报告对话框,以提供更符合其应用程序风格的用户界面或包含更多特定的上下文信息。

WerReportSetUIOption函数

Windows Vista操作系统引入的公共API允许开发者通过WerReportSetUIOption函数对错误报告对话框进行一定程度的定制:

  • 设置对话框中显示的特定文本
  • 添加自定义操作按钮
  • 修改预定义UI元素的行为

注意:WER对对话框的自定义能力有限,主要允许修改预定义元素

自定义错误处理机制

对于需要高度自定义用户界面的场景,开发者可以:

  • 实现自定义异常处理机制
  • 捕获错误时显示完全自定义的对话框
  • 收集必要的诊断信息
  • 使用WER API在后台发送错误报告
  • 提供更符合应用程序风格的错误反馈体验

系统管理员也可以通过组策略来禁用关键错误的默认用户界面显示。在某些企业环境中,为了避免打扰用户或实现静默的错误报告,管理员可能会选择禁用WER的默认对话框。在这种情况下,应用程序仍然可以利用WER API在后台发送错误报告,而不会显示任何用户界面。

总的来说,虽然WER提供了一些自定义错误报告对话框的能力,但对于需要高度定制化用户界面的场景,开发者可能需要结合使用WER API和自定义的异常处理机制来实现更灵活的错误反馈和报告策略。

6. 分析WER报告

6.1 WER报告的结构与关键信息解读

Windows错误报告 (WER) 生成的报告文件(通常是.WER文件)包含着丰富的信息,对于诊断应用程序或系统故障至关重要。理解这些报告的结构以及如何解读其中的关键信息是进行有效分析的前提。

典型WER文件包含的字段
字段名称 描述 对开发人员的意义
EventTime 事件发生的时间 帮助确定错误发生的具体时间,以便与其他日志信息关联分析
ReportIdentifier 报告的唯一标识符 用于唯一标识一个错误报告实例
AppName 发生错误的应用程序名称 确定哪个应用程序发生了错误
AppPath 应用程序的完整路径 了解应用程序的安装位置,有助于排查路径相关问题
ModuleName 发生错误的模块(如DLL) 指示哪个模块可能导致了错误,缩小问题范围
ModuleVersion 模块的版本号 确定具体的模块版本,有助于版本相关问题排查
Exception Code 异常代码(十六进制) 指示错误的类型,如访问违规、除零错误等
Exception Offset 异常在模块中的偏移位置 定位到模块中发生错误的具体代码位置
Bucket ID 存储桶标识符 用于分组相似错误,识别共同根本原因
OS Version 操作系统版本 了解错误发生的系统环境,识别与OS版本相关的问题

除了.WER文件中的基本信息外,WER报告通常还会包含发生崩溃或冻结的应用程序的完整路径,应用程序在运行时加载的所有模块(例如DLL文件)的列表,应用程序自身的元数据(例如版本号、名称等),以及计算机操作系统的元数据(例如操作系统版本、系统架构等)。

在WER报告中,一些关键信息尤其值得关注。例如,AppName字段指明了哪个应用程序发生了错误;Exception Code(异常代码)是一个十六进制的错误代码,指示了发生问题时的具体错误类型;Exception Offset(异常偏移量)则反映了应用程序代码中发生异常的具体位置。

此外,WER报告通常会包含一个存储桶ID (Bucket ID)。这个ID是WER系统根据错误的各种特征计算出来的,用于标识具有相似根本原因的崩溃事件。通过比较不同报告的存储桶ID,开发者可以判断是否存在重复发生的问题。

6.2 系统开发人员分析操作系统组件错误报告的策略

对于系统开发人员来说,分析操作系统组件的错误报告通常涉及到更底层的系统知识和专门的调试工具。当需要分析WER生成的操作系统组件错误报告时,例如内核崩溃转储文件,最常用的工具是WinDBG。

系统开发人员分析策略

  1. 仔细检查堆栈跟踪

    堆栈跟踪记录了导致崩溃的函数调用序列。从堆栈顶部开始分析,找到与操作系统核心组件或可疑驱动程序相关的函数调用。崩溃最直接的原因通常在堆栈顶部附近。

  2. 检查故障模块名称

    在内核崩溃报告中,WinDBG通常会高亮显示导致崩溃的驱动程序或模块。如果FAULTING_MODULE或IMAGE_NAME指向特定的驱动程序,该驱动程序很可能是系统崩溃的原因。

  3. 交叉引用不同崩溃中的错误代码和模块

    如果多个崩溃报告都指向同一个驱动程序或模块,这通常是强烈的信号,表明该组件存在潜在问题,需要进行更新、修复或进一步调查。

  4. 结合使用Windows事件查看器

    通过查看崩溃发生时间附近的系统日志,可能发现其他相关的错误或警告信息,例如硬件故障、驱动程序加载失败或其他系统组件报告的问题。

系统开发人员在分析操作系统组件的WER报告时,需要具备扎实的操作系统原理知识,熟悉内核调试工具(如WinDBG)的使用,并能够综合分析崩溃转储文件和系统日志等多方面的信息,才能有效地诊断和解决问题。

6.3 应用程序开发人员分析其应用程序错误报告的方法

对于应用程序开发人员来说,分析其应用程序的Windows错误报告 (WER) 同样至关重要,它可以帮助他们识别和解决应用程序中存在的bug,从而提升软件的质量和用户体验。

使用调试器分析崩溃转储

使用Visual Studio或WinDBG加载WER报告中的minidump文件,查看崩溃时的堆栈跟踪、异常信息和内存状态,定位错误的具体位置。

分析存储桶和错误模式

关注具有相同存储桶ID的崩溃报告,识别重复发生的问题,确定其共同特征和可能的根本原因,优先解决影响面广的问题。

利用第三方工具辅助分析

使用AppCrashView等工具查看本地崩溃报告的详细信息,获取崩溃时间、应用名称、故障模块等基本信息,筛选和导出报告数据。

应用程序开发人员可以使用多种方法来分析其应用程序的WER报告。一种常见的方法是使用Visual Studio或WinDBG等调试器加载并分析WER报告中包含的用户模式崩溃转储文件。通过调试器,开发者可以查看崩溃发生时的应用程序状态,包括当时的线程信息、内存内容以及函数调用堆栈。检查异常类型和堆栈跟踪是定位错误代码位置的关键步骤。堆栈跟踪会显示导致崩溃的函数调用序列,开发者可以从中找到自己应用程序的代码,从而确定发生错误的具体函数和代码行。

如果应用程序在生成错误报告时注册了特定的元数据或文件(如配置文件、日志文件),这些信息也会包含在WER报告中。应用程序开发人员应该仔细分析这些额外的信息,因为它们通常包含了应用程序在崩溃时的关键状态和上下文,有助于理解错误发生的具体场景。

对于发布到用户手中的应用程序,开发者可以通过Microsoft提供的开发者仪表板(例如Windows Dev Center)来访问用户提交的WER报告。这些报告通常会按照存储桶进行分类,开发者可以查看每个存储桶中的崩溃数量、发生频率以及相关的错误信息。分析这些汇总的报告可以帮助开发者了解哪些问题是用户最常遇到的,从而确定修复的优先级。

6.4 使用WinDBG分析WER崩溃转储

WinDBG是一个功能强大的调试器,可以用于深入分析Windows错误报告 (WER) 生成的崩溃转储文件,无论是用户模式还是内核模式的转储。对于开发者来说,掌握使用WinDBG分析崩溃转储的技能,对于诊断复杂的应用程序或系统问题至关重要。

WinDBG关键命令

基本调试命令

  • !analyze -v: 自动分析崩溃
  • lm: 列出加载的模块
  • kbk: 显示堆栈
  • ~*kb: 显示所有线程的堆栈

.NET特定命令

  • .loadby sos clr: 加载SOS扩展
  • !clrstack -a: 显示托管堆栈
  • !dumpstackobjects: 显示堆栈对象
  • !dumpobj: 显示对象详情

进程和线程命令

  • !process 0 0: 列出所有进程
  • !process 0: 查看特定进程
  • !threads: 显示所有线程
  • ~s: 切换到特定线程

要开始使用WinDBG分析WER崩溃转储,首先需要打开WinDBG应用程序,然后通过"文件"菜单选择"打开崩溃转储"并加载目标.dmp文件。加载转储文件后,WinDBG会显示一些基本信息,例如操作系统版本和崩溃时间。

接下来,通常需要设置符号路径。符号文件包含了程序编译时生成的调试信息,例如函数名和变量名,这对于理解崩溃转储中的代码执行流程至关重要。可以在WinDBG的"文件"菜单中选择"符号文件路径",然后添加Microsoft的公共符号服务器地址(例如srv*https://msdl.microsoft.com/download/symbols)以及可能包含应用程序自身符号文件的本地路径。

加载符号后,最常用的分析命令是!analyze -v。这个命令会自动分析崩溃转储,尝试识别崩溃的原因,并给出一些初步的分析结果,例如崩溃代码、参数以及可能的故障模块。

WinDBG分析崩溃转储的典型步骤

  1. 打开WinDBG并加载崩溃转储文件
  2. 设置符号路径,确保能够解析模块和函数名
  3. 运行!analyze -v进行初步自动分析
  4. 检查崩溃的异常类型和代码
  5. 查看堆栈跟踪,确定崩溃发生的代码路径
  6. 检查涉及的模块,特别是显示为故障模块的那些
  7. 如果是.NET应用程序,加载SOS扩展并使用特定命令
  8. 根据需要使用更高级的命令进行深入分析

6.5 其他WER报告分析工具

除了功能强大的WinDBG调试器,还有一些其他的工具可以帮助开发者分析Windows错误报告 (WER) 生成的报告,这些工具通常提供更简洁的界面或专注于特定的分析任务。

AppCrashView

由NirSoft开发的小型实用程序,专门用于显示系统中所有应用程序崩溃的详细信息:

  • 从WER创建的.wer文件中提取崩溃信息
  • 以列表形式展示应用崩溃事件
  • 显示应用名称、崩溃时间、故障模块等信息
  • 提供简单易用的界面,方便快速查看
  • 支持将报告导出为文本、HTML、XML或CSV格式
BlueScreenView

NirSoft的另一款实用工具,专门用于查看蓝屏死机(STOP错误)信息:

  • 读取系统转储文件中的蓝屏信息
  • 显示蓝屏错误代码和相关驱动程序信息
  • 识别可能导致崩溃的驱动程序
  • 支持多个崩溃转储的比较分析
  • 对于诊断操作系统级别崩溃非常有帮助
WhatIsHang

也是NirSoft开发的工具,用于获取关于停止响应的Windows软件的信息:

  • 当应用程序进入"未响应"状态时进行分析
  • 收集关于挂起进程的信息
  • 显示正在执行的操作和调用的函数
  • 适用于分析应用程序挂起的原因
  • 帮助开发者优化应用程序响应性
Windows事件查看器

Windows系统内置的事件查看工具,也是一个重要的WER报告分析工具:

  • WER在应用崩溃时会在应用日志中记录事件
  • 事件ID通常为1000或1001
  • 包含应用名称、版本、故障模块和异常代码等信息
  • 可结合其他系统和应用日志进行分析
  • 提供错误发生时的完整上下文信息

总而言之,虽然WinDBG提供了最强大的分析能力,但AppCrashView、BlueScreenView、WhatIsHang和事件查看器等其他工具也各有优势,它们通常提供更便捷的界面或专注于特定的分析场景,可以作为WinDBG的补充,帮助开发者更高效地分析WER报告,诊断和解决Windows应用程序及操作系统的问题。

7. WER的高级主题

7.1 处理不同类型的错误和异常

Windows错误报告 (WER) 的强大之处在于它能够处理多种不同类型的错误和异常。WER不仅可以报告应用程序的崩溃(通常是由于未处理的异常引起的)和无响应(例如应用程序长时间没有响应用户输入),还可以捕获更底层的系统故障,例如内核错误、设备驱动程序问题等。此外,WER还能报告一些更细致的异常情况,例如应用程序进程中的堆栈耗尽、PEB/TEB数据结构损坏以及堆内存损坏等。

应用程序崩溃

由未处理的异常导致程序终止:

  • 访问违规(空指针引用)
  • 越界访问数组或内存
  • 除零错误
  • 堆栈溢出
  • 未知操作码

分析重点:异常代码和堆栈跟踪

应用程序无响应

应用程序仍在运行但无法响应用户输入:

  • 死锁(两个线程互相等待资源)
  • UI线程阻塞
  • 无限循环
  • 长时间I/O操作
  • 资源耗尽

分析重点:线程状态和资源使用

系统级错误

操作系统内核或驱动程序的错误:

  • 驱动程序崩溃
  • 内核崩溃(蓝屏)
  • 硬件故障
  • 资源耗尽
  • 临界系统服务失败

分析重点:故障模块和系统日志

对于应用程序开发人员来说,他们可以使用WER API主动为那些并非导致程序崩溃或无响应的非致命错误生成报告。这使得开发者可以监控应用程序内部的各种异常情况,即使这些异常被应用程序本身捕获和处理了,仍然可以将相关信息报告给WER,以便进行后续的分析和改进。

不同的错误类型通常需要不同的分析和调试策略。例如,对于应用程序崩溃,开发者可能需要重点分析崩溃转储文件中的堆栈信息和异常代码;而对于系统级的内核崩溃,则需要使用内核调试器检查内核内存和相关的驱动程序状态。了解不同错误类型的特点以及如何利用WER报告中的信息进行诊断,是系统和应用程序开发人员必备的技能。

7.2 自定义错误报告对话框和用户交互

虽然Windows错误报告 (WER) 系统提供了标准的错误报告对话框,但在某些高级应用场景下,开发者可能希望对错误报告对话框的外观和行为进行自定义,以提供更贴合其应用程序风格的用户体验,或者收集更多用户反馈信息。

使用WER API自定义对话框

WER API提供了一定能力来定制错误报告对话框:

  • 使用WerReportSetUIOption函数设置UI选项
  • 修改对话框中显示的文本信息
  • 添加自定义操作按钮
  • 控制对话框显示的内容和行为
  • 在有限范围内创建符合应用风格的报告界面
应用程序恢复和重启

结合应用程序恢复和重启功能,提升用户体验:

  • 注册恢复和重启回调函数
  • 在应用崩溃前执行数据保存操作
  • 崩溃后自动重启应用程序
  • 在重启时恢复用户之前的工作状态
  • 提供清晰的错误信息和恢复指导

需要注意的是,WER对错误报告对话框的自定义能力并不是完全开放的,主要还是允许开发者在WER提供的框架内进行一些有限的修改。对于需要完全自定义用户界面和交互流程的场景,开发者可能需要采用更底层的异常处理机制,并在捕获到错误时显示完全自定义的对话框,然后通过WER API将相关的诊断信息发送给Microsoft。

在企业环境中,系统管理员可能会通过组策略禁用WER的用户界面,从而实现静默的错误报告过程。在这种情况下,应用程序开发者仍可以使用WER API在后台收集和提交错误报告,而不会打扰用户。

7.3 将WER数据集成到开发和测试流程中

将Windows错误报告 (WER) 收集到的数据集成到软件开发和测试流程中,可以显著提高问题管理和解决的效率,并最终提升软件的整体质量。

WER集成到开发流程
graph TD A[WER错误报告] -->|自动创建| B[Bug跟踪系统] A -->|提供统计数据| C[优先级确定] A -->|早期测试阶段| D[内部测试反馈] A -->|Beta版发布| E[早期用户反馈] B -->|分配给开发人员| F[问题调查和修复] C -->|开发资源分配| F D -->|发现潜在问题| G[发布前修复] E -->|识别用户环境问题| G F -->|验证修复| H[问题解决] G -->|提高软件质量| I[稳定版本发布] H -->|持续改进| I style A fill:#d4e6f1,stroke:#333,stroke-width:1px style B fill:#aed6f1,stroke:#333,stroke-width:1px style C fill:#aed6f1,stroke:#333,stroke-width:1px style D fill:#aed6f1,stroke:#333,stroke-width:1px style E fill:#aed6f1,stroke:#333,stroke-width:1px style F fill:#5499c7,stroke:#333,stroke-width:1px,color:#fff style G fill:#5499c7,stroke:#333,stroke-width:1px,color:#fff style H fill:#d4e6f1,stroke:#333,stroke-width:1px style I fill:#d4e6f1,stroke:#333,stroke-width:1px

一种常见的做法是将WER收集到的错误报告与现有的bug跟踪系统(例如Jira、Bugzilla等)和开发工作流程进行集成。当WER报告一个新的错误或一个频繁发生的崩溃时,可以自动在bug跟踪系统中创建一个新的issue,并将WER报告中的关键信息(例如错误代码、堆栈跟踪、存储桶ID等)附加到该issue上。这样,开发团队就可以及时了解用户遇到的问题,并将其纳入到开发计划中进行修复。

在软件的内部测试和beta预发布部署阶段,WER可以发挥重要的作用。通过在这些早期阶段启用WER,开发团队可以捕获到内部测试人员和早期用户在使用软件时遇到的bug和问题。WER收集到的错误报告可以作为重要的反馈来源,帮助开发团队在软件正式发布之前发现并修复潜在的缺陷。

WER数据集成的最佳实践

  • 建立自动化流程,将WER报告转换为bug跟踪系统中的任务
  • 设置关键指标和阈值,以便在错误频率超过预定水平时触发警报
  • 在每个开发迭代中分析WER数据,了解软件质量的趋势
  • 创建专门的仪表板,显示最常见的错误和其解决状态
  • 将WER数据与其他质量指标(如性能测试结果)结合分析
  • 在发布前对已修复的问题进行验证,确保修复的有效性

此外,WER提供的错误统计数据对于确定开发工作的优先级也非常有价值。通过分析WER报告中不同错误的发生频率和影响范围,开发团队可以了解哪些问题是用户最常遇到的,哪些问题对用户体验的影响最大,从而优先解决这些关键问题,确保开发资源得到最有效的利用。

为了更有效地将WER数据集成到开发和测试流程中,开发团队可以使用各种工具和技术,例如WER API、脚本自动化以及与bug跟踪系统集成的插件等。通过建立一个完善的WER数据集成流程,可以实现更高效的错误管理、更快速的问题解决以及更高质量的软件交付。

7.4 WER在故障排除和支持中的应用

Windows错误报告 (WER) 不仅对于软件开发人员来说是一个重要的工具,对于技术支持团队来说也同样具有重要的价值,可以帮助他们更有效地诊断用户遇到的问题并提供相应的解决方案。

技术支持场景

WER可以帮助支持人员更有效地解决用户问题:

  • 根据错误代码和故障模块信息,快速识别问题类型
  • 查找相关的知识库文章和已知解决方案
  • 分析堆栈跟踪,了解错误发生的代码路径
  • 根据用户提供的额外诊断信息,定位特定环境问题
  • 利用WER提供的自动解决方案引导用户自行解决问题
企业IT管理

在企业环境中,WER可以集成到IT管理系统:

  • 配置企业WER服务器,集中收集和分析错误报告
  • 创建自定义的错误响应策略
  • 根据错误模式主动更新或回滚驱动程序和软件
  • 识别特定硬件或软件配置相关的系统问题
  • 生成IT环境健康报告,评估系统稳定性

当用户在使用Windows操作系统或某个应用程序时遇到问题并报告给技术支持团队时,WER报告中包含的详细信息可以帮助支持人员快速了解问题的性质和范围。例如,WER报告中会记录发生错误的应用程序名称、版本、故障模块、错误代码以及相关的堆栈信息等。这些信息可以帮助支持人员初步判断问题的类型,例如是应用程序崩溃、操作系统错误还是驱动程序问题。

通过分析WER报告中的错误代码和故障模块,支持人员可以查找相关的知识库文章、已知的bug记录或者解决方案。WER报告中包含的堆栈跟踪信息可以帮助支持人员了解错误发生的具体代码路径,从而更好地理解问题的根本原因。

此外,WER还允许用户选择发送额外的诊断信息,例如相关的日志文件或配置文件。这些额外的信息对于支持人员来说非常有价值,因为它们可以提供更全面的问题上下文,帮助他们更准确地判断问题的原因并提供更有效的解决方案。

在某些情况下,WER还会自动将用户引导至已知的解决方案,例如推荐安装最新的软件更新或补丁程序。这可以帮助用户自行解决一些常见问题,从而减少对技术支持的依赖。

8. 总结与未来展望

8.1 WER在Windows开发生态系统中的重要性

Windows错误报告 (WER) 在整个Windows开发生态系统中扮演着至关重要的角色。它不仅为Microsoft提供了海量的错误反馈数据,用于持续改进Windows操作系统本身的质量和稳定性,也为第三方软件和硬件开发者提供了一个宝贵的渠道,了解用户在使用其产品时遇到的问题。

WER对Windows生态系统的主要贡献

  • 提升整体质量: 通过收集用户实际使用场景中的错误信息,帮助开发者发现和修复难以在测试环境中重现的问题。
  • 数据驱动决策: 提供统计数据支持开发资源分配和优先级确定,确保解决最影响用户的问题。
  • 快速响应: 使开发团队能够及时了解新版本发布后出现的问题,迅速提供修复。
  • 用户体验改善: 通过提供解决方案或自动修复功能,减少用户遇到的挫折和中断。
  • 开发者支持: 为第三方开发者提供宝贵的诊断数据,帮助他们改进自己的产品。

WER的存在极大地促进了Windows平台的健康发展,使得开发者能够基于真实的用户数据来优化和完善他们的产品。通过WER,Microsoft不仅能够收集海量的错误报告并用于改进操作系统,还能够与硬件和软件合作伙伴分享这些数据,形成一个共同提升产品质量的生态系统。

随着技术的不断发展,WER也在持续进化,不断增强其诊断能力和用户体验。从最初的基本错误报告功能,到现在能够处理多种类型错误、提供自动解决方案的复杂系统,WER始终致力于为开发者提供更好的工具,为用户提供更稳定的计算体验。

8.2 针对系统和应用程序开发人员的最佳实践总结

在探讨了Windows错误报告 (WER) 的各个方面后,我们可以总结出一些针对Windows系统开发人员和应用程序开发人员的关键最佳实践。

Windows系统开发人员最佳实践
  • 利用WER报告大规模监控和诊断操作系统级别的错误和崩溃
  • 分析WER收集的统计数据,确定开发和修复工作的优先级
  • 在需要时配置WER收集更详细的系统级诊断信息,例如完整的内存转储和详细日志
  • 熟练使用WinDBG等调试工具分析操作系统组件的错误报告,定位根本原因
  • 将WER作为系统监控的一部分,主动识别潜在的稳定性问题
  • 利用渐进式数据收集方法,在需要时请求更详细的诊断信息
  • 结合系统事件日志和性能监控数据,全面分析系统健康状况
  • 持续跟踪修复效果,验证解决方案的有效性
Windows应用程序开发人员最佳实践
  • 集成WER以自动捕获应用程序错误、异常和崩溃,无需额外编码即可受益
  • 使用WER API和工具收集特定的应用程序状态和上下文信息,增强错误报告的价值
  • 定期分析应用程序的WER报告,了解用户遇到的问题,并据此改进应用程序质量
  • 根据需要自定义应用程序的错误报告行为,例如排除特定应用程序或启用本地转储收集
  • 注册关键的应用程序文件和内存区域,以包含在错误报告中
  • 利用应用程序恢复和重启功能,提升用户体验
  • 将WER报告与bug跟踪系统集成,建立自动化的问题管理流程
  • 在开发和测试阶段积极使用WER,及早发现并解决问题

8.3 WER的未来发展趋势与潜在改进

随着技术的不断发展,Windows错误报告 (WER) 未来可能会在以下几个方面进行改进和发展:

更智能的错误分析

利用人工智能和机器学习技术,自动分析WER报告,更准确地识别错误的根本原因,并提供更具针对性的解决方案。

更丰富的数据收集

在尊重用户隐私的前提下,收集更多与错误相关的系统和应用程序状态信息,例如用户操作步骤、性能数据等,以提供更全面的诊断依据。

更强大的开发者工具

提供更易用、功能更强大的工具,帮助开发者分析和管理WER报告,例如更直观的图形界面、更灵活的查询和过滤功能。

更主动的错误预防

通过分析大量的历史错误报告,预测潜在的系统和应用程序问题,并在问题发生前采取预防措施,例如自动更新关键组件或提供预防性建议。

更好的跨平台集成

考虑将WER的经验和技术应用于其他平台,例如云服务和移动设备,以实现更统一的错误报告和分析体验,特别是对于跨平台应用程序。

随着计算环境的日益复杂化和多样化,WER系统也需要不断适应和发展。与此同时,随着用户对隐私和数据安全的关注度不断提高,WER也需要在收集有用诊断信息和保护用户隐私之间取得更好的平衡。未来的WER系统可能会采用更先进的数据匿名化和加密技术,确保在提供高质量诊断服务的同时,最大限度地保护用户的敏感信息。

总的来说,WER作为Windows平台错误反馈和诊断的核心机制,将继续在提升操作系统和应用程序质量方面发挥重要作用。通过持续的创新和改进,WER将为开发者提供更强大的工具,为用户带来更稳定可靠的计算体验。

延伸阅读

《Debugging in the (Very) Large: Ten Years of Implementation and Experience》
Kirk Glerum, Kinshuman Kinshumann, et al. (Microsoft Corporation)
这篇ACM发表的论文详细讨论了WER系统的设计、实现和十年运营经验。作为WER系统的创建者,作者们分享了收集和分析数亿错误报告的经验,以及如何利用这些数据改进Windows和应用程序质量。
《Windows Internals, 7th Edition》
Pavel Yosifovich, Alex Ionescu, Mark Russinovich, David Solomon
这本经典著作深入探讨了Windows操作系统的内部工作原理,包括对WER系统的详细介绍。书中解释了WER如何与其他系统组件交互,以及如何在内核和用户模式下捕获和处理错误。
《Advanced Windows Debugging》
Mario Hewardt, Daniel Pravat
这本书提供了Windows调试的深入指南,包括如何使用WinDBG分析崩溃转储和WER生成的报告。书中包含许多实际案例和高级调试技术,帮助开发者解决复杂的错误和崩溃问题。
《Windows Application Quality Cookbook》
Microsoft Windows Team
这本来自Microsoft的指南专注于如何利用WER和其他Windows特性提高应用程序质量。它提供了实用的建议和最佳实践,帮助开发者创建更稳定、更可靠的Windows应用程序。
《Practical Debugging for .NET Developers》
Michael Meyers, Scott Southwood
这本面向.NET开发者的书籍详细介绍了如何调试.NET应用程序,包括如何有效利用WER收集和分析崩溃信息。它提供了许多实际例子和工具使用指南,特别适合Windows应用程序开发者。

参考文献

[1] Windows Error Reporting and Windows diagnostics enablement guidance, Microsoft Learn, accessed March 24, 2025
[2] Troubleshooting Using WER Reports, Microsoft Windows Server Documentation, GitHub, accessed March 24, 2025
[3] Windows Error Reporting, Wikipedia, accessed March 24, 2025
[4] Windows Forensic Artifacts: WER Files, GitHub, accessed March 24, 2025
[5] Using Windows Error Reporting in .NET, minidump.net, accessed March 24, 2025
[6] What do Windows Error Reports ACTUALLY send?, YouTube, accessed March 24, 2025
[7] Windows Error Reporting: DFIR Benefits and Privacy Concerns, SANS Institute, accessed March 24, 2025
[8] Windows Error Reporting, Igor Pro, accessed March 24, 2025
[9] Debugging in the (Very) Large: Ten Years of Implementation and Experience, ACM, accessed March 24, 2025
[10] Debugging in the (Very) Large: Ten Years of Implementation and Experience, ACM SIGOPS, accessed March 24, 2025
[11] When Applications Crash Part II - WER, TMurgent, accessed March 24, 2025
[12] Windows Error Reporting Diagnostics Enablement Guidance, GitHub, accessed March 24, 2025
[13] WER Settings, Win32 apps, Microsoft Learn, accessed March 24, 2025
[14] WER Settings, GitHub, accessed March 24, 2025
[15] The application or service crashing behavior troubleshooting, Microsoft Learn, accessed March 24, 2025
[16] How to collect user-mode crash dumps with Windows Error, Veritas, accessed March 24, 2025
[17] Collecting User-Mode Dumps, Win32 apps, Microsoft Learn, accessed March 24, 2025
[18] Improving Application Quality with Windows Error Reporting, CodeGuru, accessed March 24, 2025