解密.NET clr20r3异常参数P1..P10


79

clr20r3当我的应用程序遇到异常时,我试图破译与P1 ... P10参数相关联的含义,该参数写入事件日志。

能找到的最好的是:

  • P1:托管过程(例如 w3wp.exe
  • P2:托管进程版本(例如 6.0.3790.1830
  • P3:??? (例如 42435be1
  • P4:引发异常的程序集(例如 mrtables.webservice
  • P5:组装版本(例如 2.1.2.0
  • P6:??? (例如 4682617f
  • P7:??? (例如 129
  • P8:??? (例如 50
  • P9:引发的异常类型(例如 system.argumentexception
  • P10:??? (例如 NIL

对clr20r3进行谷歌搜索提供了成千上万个样本参数值,有人可以尝试从中导出模式。

但是我希望能找到有关参数含义的文档,而不是有根据的猜测。


编辑:虽然我可以希望能得到规范的文档,但实际上我很高兴看到抛出异常的那一行在哪一行完成了堆栈跟踪。

奖励阅读


Answers:


80

这是有关Watson Bucket的信息

  1. exe文件名
  2. Exe文件程序集版本号
  3. exe文件邮票
  4. exe文件的完整程序集名称
  5. 装配版本故障
  6. 组装时间戳错误
  7. 故障组装方法def
  8. 故障方法IL在故障方法内的偏移
  9. 异常类型

并且这是同一篇文章的MSDN

样品:

  Problem Signature 01: devenv.exe
  Problem Signature 02: 11.0.50727.1
  Problem Signature 03: 5011ecaa
  Problem Signature 04: Microsoft.VisualStudio.SharePoint.Project
  Problem Signature 05: 11.0.60226.0
  Problem Signature 06: 512c2dba
  Problem Signature 07: 18a8
  Problem Signature 08: 1d
  Problem Signature 09: System.NullReferenceException

2
您是否会碰巧有一个参考链接来记录其余的Watson Bucket?链接的文章仅提及了其中三个(并且恰好在传递时提及了它们:“例如,存储区P4描述了故障模块,存储区P9显示了未处理的异常类型,存储区P8表示了该异常所在的IL偏移量最初被抛出。”
伊恩·博伊德

2
我添加了一个示例
Kiquenet 2014年

111

P7和P8是找出P9异常发生位置的重要参数。使用P4知道要查找的程序集。运行ildasm.exe并打开该程序集。单击文件+转储,选中“令牌值”复选框,然后单击确定,然后将.il文件保存在某个位置。

在文本编辑器中打开文件。P7给您方法令牌,它以0x06开头,生成令牌值“ 06000129”。搜索:

.method /*06000129*/

它为您提供方法名称,然后从那里查找以找到.class,从而为您提供类名称。

P8为您提供IL偏移。从找到的.method中,查找IL_0050以查找引发异常的指令。将其映射回您的源代码有些棘手,但您可能会发现。如有必要,请使用Reflector。

通常,编写事件处理程序AppDomain.UnhandledException可避免对这些Watson崩溃存储桶进行逆向工程。记录值e.ExceptionObject.ToString()以获取异常消息和堆栈跟踪。


2
如果该异常发生在库代码中,则无论如何您都可能需要堆栈跟踪以找出堆栈中的哪些代码。(如果Microsoft修改该对话框使其对.NET更好,那就更好了。)
Jason Kresowaty 2010年

1
除了处理UnhandledException外,它还有助于在Main内部进行尝试/捕获,因为有时问题是在安装UnhandledException处理程序之前发生的。
Mark Lakata 2012年

1
我认为这将为我节省我的朋友。我有一个陷入崩溃的ASP.NET应用程序,它使应用程序池不断崩溃-崩溃时间CLR20R3前后,有关这些P值的错误列表正在记录。它可能很杂乱,但可能会导致我找到解决方案,但最后,我将不得不修改此代码并进行一些实际的日志记录。
Mike Perrenoud

1
如果可以的话,非常有用+10-在我的情况下,这是一个StackOverFlow异常,并且我的catch博客未执行。
Marc 2013年

1
在此之后,我发现我们代码崩溃的函数是一个抽象的虚函数。方法/ * 06003452 * / public hidebysig newslot抽象虚拟实例int32 Read([in] [out] uint8 []缓冲区,int32偏移量, int32 count)cilmanaged {} //方法结束Stream :: Read
Steven Scott
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.