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

标签 c# .net windbg sos

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

示例情况

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

0:000> !do 00000000ffaaa690<br/> <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 并且似乎缺少此命令:(

最佳答案

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

关于c# - 在堆上查找最接近给定地址的 .NET 对象 (.NET2.0/3.5),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33957621/

相关文章:

c# - Roslyn - 查找具有完全限定名称的声明

c# - 方法重载决议系统如何决定在传递空值时调用哪个方法?

windows - Application Verifier 自动创建过程转储文件

c# - 规则/验证设计模式

c# - 为本地主机上的任何端口启用 CORS

c# - 从汇编中获取 MSIL?

.net - 64 位中的内存泄漏是否需要比 32 位更长的时间才能导致 OutOfMemoryException

windbg - 将WinDbg设置为默认调试器

c# - 我如何分析 C# prodump 崩溃转储文件,异常来自 CLR?

c# - 如何绘制/覆盖图像文件到位图图像?