我正在研究 SOS 命令及其输出,但我注意到似乎没有办法以某种方式真正获取当前正在使用的所有类型。到目前为止最好的方法是 !dumpheap -stat
,但它只列出有实例的类型。
但是,当 ValueType 从不装箱时,该类型将不会显示在 !dumpheap -stat
上。 . (这并不奇怪,因为它们不是在堆上分配的。)
所以我的问题是:
是否有任何有效的方法来确定当前存在哪些额外的 ValueTypes?
我的意思是,我可以在检查单个堆对象时按需加载它们(类似于 !dumpvc <mt> <address>
基于 !do <address>
输出),但是对于显示的统计信息,最好通过一些比查看(实例)更简单的方法来查找类型/class definitions of)所有已知类以确定它们是否使用任何额外的 ValueTypes。
最佳答案
似乎没有任何有效的方法可以做到这一点。换句话说,我最终检查了返回的每种类型 !DumpHeap -stat
是结构数组还是包含结构字段。在这两种情况下,我都需要递归地检查新发现的结构类型是否也包含任何结构字段。在那种情况下需要递归,除非我已经看到了结构类型。
!DumpModule -mt
不是选项,顺便说一下。例如,我看到 System.Collections.Generic.List`1
,但没有任何内容可以代表例如列表类。
关于clr - 获取 !dumpheap -stat 中未列出的 ValueTypes 的名称/MT 的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10753234/