clr - 获取 !dumpheap -stat 中未列出的 ValueTypes 的名称/MT 的有效方法

标签 clr windbg value-type sos dbghelp

我正在研究 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/

相关文章:

flash - 在要进行 GC 的对象中将引用设置为 null?

.net - 如何为 .NET 进行良好的故障转储?

c# - List<Rectangle> - 表现得像有一个拳击

c# - 将指针传递给另一个进程

c# - 为什么 C#/CLR 不支持方法重写协方差/反方差?

sql-server - 创建 CLR 表值函数

c++ - 在每个转储中发现更多堆,它们来自哪里?

c++ - DbgEng - 不通过回调获取命令输出

haskell - Haskell 中的约束值类型

c# - 为什么我可以检查 DateTime 是否为 null,即使它是一个值类型?