2010-07-10 11 views
13

Ứng dụng .Net 4.0 tiếp tục bị lỗi cho người dùng, nhưng chỉ cho anh ta, tôi không thể tạo lại lỗi. Anh ta đính kèm tệp WERInternalMetadata.xml do Trình báo cáo sự cố Windows tạo ra. Bằng cách mở nó tôi phát hiện ra rằng đó là một System.IO.FileNotFoundException mà treo phần mềm, tuy nhiên, không có chức năng được gọi là trong chức năng đó sẽ ném loại ngoại lệ, do đó, là vấn đề ở một nơi khác hoặc sâu hơn.Làm thế nào để phân tích tệp WERInternalMetadata.xml được tạo bởi Windows Crash Reporter?

Đây là phần "thú vị nhất" của tệp. Nó chứa số thập lục phân (hexadecimal), nhưng tôi không thể tìm ra ý nghĩa của chúng.

<ProblemSignatures> 
    <EventType>CLR20r3</EventType> 
    <Parameter0>rstvshowtracker.exe</Parameter0> 
    <Parameter1>1.0.3842.33258</Parameter1> 
    <Parameter2>4c374e79</Parameter2> 
    <Parameter3>mscorlib</Parameter3> 
    <Parameter4>4.0.0.0</Parameter4> 
    <Parameter5>4ba1da6f</Parameter5> 
    <Parameter6>1620</Parameter6> 
    <Parameter7>14</Parameter7> 
    <Parameter8>System.IO.FileNotFoundException</Parameter8> 
</ProblemSignatures> 

Có cách nào để tìm ra mã nào gây ra ngoại lệ hoặc ít nhất để tìm hiểu thêm chi tiết hơn số FileNotFoundException?

Trả lời

17

Thứ nhất, đây là những gì trong đó WER dấu vết:

<Parameter0>rstvshowtracker.exe</Parameter0> - your exe 
<Parameter1>1.0.3842.33258</Parameter1> - version of your exe 
<Parameter2>4c374e79</Parameter2> - exe timestamp 
<Parameter3>mscorlib</Parameter3> - assembly/module 
<Parameter4>4.0.0.0</Parameter4> - assembly version 
<Parameter5>4ba1da6f</Parameter5> - assm timestamp 
<Parameter6>1620</Parameter6> - methodDef token of faulting method 
<Parameter7>14</Parameter7> - IL offset of faulting instruction 
<Parameter8>System.IO.FileNotFoundException</Parameter8> - exception 

Bạn có thể sử dụng WinDBG và SOS để tìm ra những phương pháp đó là (ví dụ 1620). Xem ví dụ ở đây về cách thực hiện: http://blogs.msdn.com/b/oanapl/archive/2009/01/30/windows-error-reporting-wer-and-clr-integration.aspx

... Hoặc bạn có thể kết thúc sự kiện unhandledException trong ứng dụng của mình và in ra dấu vết ngăn xếp ngoại lệ cho tệp nhật ký để xem nguyên nhân gây ra sự cố ; ví dụ.

static void MyHandler(object sender, UnhandledExceptionEventArgs args) 
{ 
    Exception e = (Exception) args.ExceptionObject; 
    // print out the exception stack trace to a log 
} 

public static void Main() 
{ 
    AppDomain currentDomain = AppDomain.CurrentDomain; 
    currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler); 
} 
+2

Cảm ơn bạn rất nhiều! Tôi đã có thể truy tìm mã không có thật. Mặt khác, tôi đang bắt sự kiện UnhandledException, nhưng nếu một ngoại lệ được ném vào một chủ đề mới, ứng dụng bị đóng băng và không có UnhandledException bị sa thải. Trong phiên bản mới, tôi đã sửa lỗi này bằng cách sử dụng Task thay vì Thread, bởi vì Tasks cho phép tôi nắm bắt các ngoại lệ được ném lên một luồng khác. – RoliSoft