【问题标题】:Diagnosing my .Net managed application crashes correctly正确诊断我的 .Net 托管应用程序崩溃
【发布时间】:2014-08-19 08:18:04
【问题描述】:

我已经到了这样一个地步,我一直在编写的项目正在进入野外 (woo) 并且人们回来时遇到了我想要修复的应用程序崩溃事件。现在我不能保证运行我的程序的 PC 上有任何类型的开发或诊断工具随时可用,所以我的问题是:

从问题事件及其所有许多问题签名中,我确信我可以找出调用方法,或者导致此错误发生的原因,因为签名看起来可能是对方法等的引用。

我收到的一个日志示例是:

Problem signature:
  Problem Event Name:    CLR20r3
  Problem Signature 01:    SarkAgent.exe
  Problem Signature 02:    0.0.0.0
  Problem Signature 03:    509a4197
  Problem Signature 04:    mscorlib
  Problem Signature 05:    4.0.30319.34014
  Problem Signature 06:    52e0b679
  Problem Signature 07:    451e
  Problem Signature 08:    13c
  Problem Signature 09:    System.UnauthorizedAccess
  OS Version:    6.3.9600.2.0.0.256.48
  Locale ID:    2057
  Additional Information 1:    5861
  Additional Information 2:    5861822e1919d7c014bbb064c64908b2
  Additional Information 3:    d1d9
  Additional Information 4:    d1d94a13d3609d6b740644c12508f581

现在我知道的一些事情是:

签名 1(我的应用程序名称,革命性的,我是解决这个问题的向导)

签名 2(我的应用程序版本)

签名 4(产生错误的库)

签名 5(那个库版本)

签名 9(引发的托管错误)

所以基本上我可以解决所有明显的问题。和所有的十六进制值我不知道什么与什么有关。如果我们把这个错误作为我们的测试用例,我该如何计算出我的代码的哪一部分导致了 boo boo?

来自 msdn 或其他关于每个问题签名实际相关的任何用具也将非常有用。 (:

这是一个 .net 4.0 Full Profile 框架。在任何给我参考“mscorwks.dll”的教程中,我改为写“clr.dll”仍然没有乐趣。

编辑: 我已经进一步发展到windbg现在在程序执行后正确加载sos的地步。运行时:

0:005> !token2ee mscorlib 0600451e
c0000005 Exception in C:\Windows\Microsoft.NET\Framework64\v4.0.30319\sos.token2ee debugger extension.
  PC: 00007ffa`c7a50c05  VA: 00000000`00000000  R/W: 0  Parameter: 00000000`00000000

编辑 2: 我已经更进一步,windbg 现在向我展示了程序集内的令牌关系。问题是 IL 不存在......随之而来的是混乱。 为了让它工作,我启动应用程序,确保最新的 .pdb 下载与

!sym -noisy
.symfix
.reload -f

然后我运行我的 .loadby sos clr,它现在可以正确加载模块“sos”。 运行时!token2ee mscorlib.dll 0600451e(两次,谢谢你)我得到了这个:

Module:      00007ffac32e1000
Assembly:    mscorlib.dll
Token:       000000000600451e
MethodDesc:  00007ffac34e1f40
Name:        System.IO.__Error.WriteNotSupported()
JITTED Code Address: 00007ffac3fb8150

当运行 !dumpil 00007ffac34e1f40 逻辑时,我应该找到 IL_013c 但我没有,我得到:

ilAddr = 00007ffac3a545f7
IL_0000: ldstr "NotSupported_UnwritableStream"
IL_0005: call System.Environment::GetResourceString
IL_000a: newobj System.NotSupportedException::.ctor
IL_000f: throw 

这也让我明白了,我正在调试“失败的模块”,它是一个 Windows 打包库。并且返回的 IL 似乎是内部投掷器,这在名为“WriteNotSupported()”的函数上是有意义的。有什么方法可以找到主机程序集(.exe)运行导致失败的方法签名(或失败所在的创建函数,或者......与我的程序相关的任何内容)

【问题讨论】:

  • 你得到的 SOS 错误很可能是这样的:stackoverflow.com/questions/25183295/… 再次运行它。或者使用 IlDasm 搜索 0600451e。
  • 您好 Dono,感谢您提示运行它两次。愚蠢的风。更新的问题。 (:
  • P5 表示 mscorlib 版本为 4.0.30319.34014。 “lm v m mscorlib”(=list module verbose match mscorlib)的输出版本是多少?元数据和偏移值是在编译二进制文件时确定的,因此它只与特定版本相关。另外,检查 .formats 52e0b679 的文件时间戳;磁盘上文件的时间戳是否相同?如果这些不匹配,则从应用程序失败的机器复制文件。与 WinDbg 不同,IlDasm 可以很好地识别方法和偏移量。有关详细信息,请参阅上面的链接。

标签: c# .net clr


【解决方案1】:

查看 MSDN 博客上的这篇文章:Windows Error Reporting and CLR integration

【讨论】:

  • 嘿,windbg 找不到 mscorwks,我已经尝试了一些我在网上找到的关于使用它的东西。我已经将 mscorwks.dll 复制到了 windbg 所在的文件夹,确保它可以访问,并且在我完成 .loadby sos 后还写出了它的完整路径。我应该怎么做才能确保在windbg搜索时找到mscorwks.dll?
  • 此外,我在 64 位和 32 位上运行了 windbg,64 位允许我同时加载 mscorwks 和 sos,但是当尝试 !token2EE 时,它告诉我 mscorwks 未加载。调试头痛 101
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-02
  • 1970-01-01
  • 2011-04-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多