面向開發人員的Windows錯誤報告(WER)


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在發生故障時始終生成轉儲,將報告發送到您指定的服務器或在本地對其進行排隊,並生成自定義報告。希望您會發現這些信息對調試和監視與應用程序相關的問題很有用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM