【发布时间】: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 可以很好地识别方法和偏移量。有关详细信息,请参阅上面的链接。