查找最接近堆上给定地址的.NET对象(.NET2.0 / 3.5)

时间:2015-11-27 12:37:47

标签: c# .net windbg sos

我想找到最接近堆上特定地址的.NET对象。

示例情况

想象一下,从某些来源我得到了一个地址0x00000000ffaaa690。当我尝试转储对象(使用SOS !do命令)时,我收到:

0:000> !do 00000000ffaaa690
<Note: this object has an invalid CLASS field> Invalid object

显然这个地址并不指向有效的MT。但我知道它在.NET堆上。如何找到最近的MT地址(对象实例地址的开头)?

在示例中,搜索到的对象位于地址00000000ffaaa680

0:000> !do 00000000ffaaa680 Name: System.String MethodTable: 000007fee6a47d90 EEClass: 000007fee664e560 Size: 36(0x24) bytes (C:\Windows\assembly\GAC_64\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll) String: 16457 Fields: MT Field Offset Type VT Attr Value Name 000007fee6a4f000 4000096 8 System.Int32 1 instance 6 m_arrayLength 000007fee6a4f000 4000097 c System.Int32 1 instance 5 m_stringLength 000007fee6a497d8 4000098 10 System.Char 1 instance 31 m_firstChar 000007fee6a47d90 4000099 20 System.String 0 shared static Empty 000007fee6a49688 400009a 28 System.Char[] 0 shared static WhitespaceChars

更新1:

正如Oguz在评论中指出的那样,SOS中有lno命令,但我看到它可能是在.NET4.0中引入的。我的转储来自 .NET2.0 / 3.5 ,似乎缺少此命令:(

1 个答案:

答案 0 :(得分:3)

试试!sosex.mln。它将显示地址所在的对象类型。它还可以告诉您地址是在托管方法还是其他类型的托管数据结构中。