如何分析Windows Crash Reporter生成的WERInternalMetadata.xml文件?

Rol*_*oft 13 .net c# crash windows-error-reporting

.Net 4.0应用程序不断为用户崩溃,但仅仅对他而言,我无法重现该错误.他附加了WERInternalMetadata.xmlWindows崩溃报告器生成的文件.通过打开它,我发现它System.IO.FileNotFoundException崩溃了软件,然而,在该函数中没有调用会抛出这种异常的函数,所以这是其他地方或更深层次的问题.

这是文件中"最有趣"的部分.它包含(十六进制)数字,但我无法找出它们的含义.

<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>
Run Code Online (Sandbox Code Playgroud)

有没有办法找出导致异常的代码,或者至少找出比其他更多的细节FileNotFoundException

Chr*_*ook 17

首先,这是WER跟踪中的内容:

<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
Run Code Online (Sandbox Code Playgroud)

您可以使用WinDBG和SOS来找出该方法是什么(例如1620).请参阅此处的示例,了解如何执行此操作:http: //blogs.msdn.com/b/oanapl/archive/2009/01/30/windows-error-reporting-wer-and-clr-integration.aspx

...或者,您可以在应用程序中挂接unhandledException事件,并将异常堆栈跟踪打印到日志文件,以查看导致该问题的原因; 例如

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);
}
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢你!我能够追查伪造的代码.另一方面,我正在捕获UnhandledException事件,但如果在新线程上抛出异常,则应用程序会冻结并且不会触发UnhandledException.在新版本中,我通过使用Tasks而不是Thread来修复此问题,因为Tasks允许我捕获在另一个线程上抛出的异常. (2认同)