是否可以实现GC.GetAliveInstancesOf <t>()(用于调试)?</t>

时间:2010-06-06 21:21:53

标签: visual-studio debugging windbg garbage-collection sos

我知道这是answered before,但我想提出一个不同的问题。

有没有可行的方法来实现GC.GetAliveInstancesOf(),可以在Visual Studio Debug Watch窗口中进行评估? Sasha Goldstein在this article中显示了一个解决方案,但它要求您要查询的每个类都继承自特定的基类。

我要强调的是,我只想在调试过程中使用这个方法,所以我不关心GC在运行时可能会在内存中更改对象的地址。

一个想法可能是以某种方式利用SOS的!dumpheap -type命令,并做一些神奇的技巧来创建一个临时变量并让它指出由SOS打印的内存地址。

有没有人有一个有效的解决方案?

2 个答案:

答案 0 :(得分:2)

implemented by Alois Kraus中的WMemoryProfiler project看起来与此非常相似。

答案 1 :(得分:1)

除了必须再次猜测某种用户代码可能有兴趣找到它不拥有的根之外,几乎没有任何东西可以拖累垃圾收集器。尽可能保持活泼是至关重要的。就此而言,您可以通过某种信心看到被引用的唯一方法是冻结可能从垃圾收集堆中分配内存的所有线程。

嗯,这是可能的,调试器就是这样做的。你已经知道Windbg的方式了。但是,它并不是专为跟踪托管对象而优化的工具。还有其他工具:内存分析器。有很多可供选择,不要试图建立自己的。从免费软件(和浪费时间)CLR Profiler,到第三方产品,如Ants和dotTrace以及许多其他产品。几百块钱可以解决你的问题,没有办法你可以自己做得更少。