C# 在堆(.NET2.0/3.5)上查找距离给定地址最近的.NET对象

C# 在堆(.NET2.0/3.5)上查找距离给定地址最近的.NET对象,c#,.net,windbg,sos,C#,.net,Windbg,Sos,我想找到离堆上特定地址最近的.NET对象 示例情况 想象一下,从某个来源我得到了一个地址0x00000000ffaa690。当我尝试转储对象时(使用SOS!do命令),我收到: 0:000> !do 00000000 FFAA690 无效对象 显然,这个地址没有指向有效的机器翻译。但我知道它在.NET堆上。如何找到最近的MT地址(对象实例地址的开头) 在本例中,搜索对象位于地址00000000 FFAA680: 0:000> !do 00000000 FFAA680 名称:System.S

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

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


0:000> !do 00000000 FFAA690
无效对象

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

在本例中,搜索对象位于地址
00000000 FFAA680


0:000> !do 00000000 FFAA680
名称:System.String
方法表:000007fee6a47d90
EEClass:000007fee664e560
大小:36(0x24)字节
(C:\Windows\assembly\GAC_64\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)
电话号码:16457
领域:
MT字段偏移类型VT属性值名称
000007fee6a4f000 4000096 8 System.Int32 1实例6米阵列长度
000007fee6a4f000 4000097 c System.Int32 1实例5米长
000007fee6a497d8 4000098 10 System.Char 1实例31 m_firstChar
000007fee6a47d90 4000099 20系统。字符串0共享静态空
000007fee6a49688 400009a 28系统。字符[]0共享静态空白字符

更新1:


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

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

can lno help?显示指定地址之前和之后的对象。该命令在垃圾收集堆中查找地址,该地址看起来是like托管对象的有效开始(基于有效的方法表)以及参数地址后面的对象。谢谢@OguzOzgul-我记得有类似的东西存在,当我在SOS中找不到它时,我写了这个问题。现在我看到这可能是在.NET4.0中引入的,我有一个.NET2.0的转储:/I正在更新这个问题。试试!sosex.mln。如果你的地址位于对象、方法中,或者任何类型的.Net数据结构,它都会告诉您它是什么。@SteveJohnson几天前我对托管堆上的一个地址运行了!mln,20分钟后命令仍在运行。我必须重新启动Windbg。@user2460798这是非常不寻常的。转储有多大?您能与我共享吗?