【问题标题】:Efficient way to get name/MT of ValueTypes not listed in !dumpheap -stat获取 !dumpheap -stat 中未列出的 ValueType 的名称/MT 的有效方法
【发布时间】:2012-05-25 10:58:37
【问题描述】:

我正在研究 SOS 命令及其输出,但我注意到似乎没有办法以某种方式获取当前正在使用的所有类型。迄今为止最好的方法是!dumpheap -stat,但它只列出存在实例的类型。 但是,当 ValueType 从未被装箱时,该类型将不会显示在 !dumpheap -stat 上。 (这并不奇怪,因为它们不是在堆上分配的。)

所以我的问题是: 是否有任何有效的方法来确定当前存在哪些附加值类型? 我的意思是,我可以在检查单个堆对象时按需加载它们(类似于基于!do <address> 输出的!dumpvc <mt> <address>),但是对于显示的统计数据,通过比查看更简单的方式找到类型会很好(实例/class 定义)所有已知的类,以确定它们是否使用任何额外的值类型。

【问题讨论】:

  • 奇怪的问题。为什么知道程序使用 System.Int32 会有用呢? !dumpmodule -mt 列出模块中的所有类型,包括值类型。
  • 我不是很喜欢 Int32 和类似的基本类型。具有多个成员的复合类型是有趣的部分,例如 System.Drawing.Color,它由一个字符串、一个 long 和两个 short 组成。

标签: clr windbg value-type sos dbghelp


【解决方案1】:

似乎没有任何有效的方法可以做到这一点。换句话说,我最终检查了返回的每个类型 !DumpHeap -stat 是否是结构数组或包含结构字段。在这两种情况下,我都需要递归检查新找到的结构类型是否也包含任何结构字段。在这种情况下需要递归,除非我已经看到了结构类型。

!DumpModule -mt 不是选项,顺便说一句。例如,我看到了System.Collections.Generic.List`1,但没有任何代表例如List 类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-23
    • 1970-01-01
    • 2012-11-03
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    • 1970-01-01
    • 2011-10-09
    相关资源
    最近更新 更多