2

我知道这个问题之前已经回答过了,但我想提出一个不同的问题。

是否有任何可以想象的方式来实现 GC.GetAliveInstancesOf(),可以在 Visual Studio Debug Watch 窗口中进行评估?Sasha Goldstein 在本文中展示了一种解决方案,但它要求您要查询的每个类都继承自特定的基类。

我要强调一下,我只想在调试期间使用此方法,所以我不在乎 GC 可能会在运行时更改对象在内存中的地址。

一个想法可能是以某种方式利用 SOS 的!dumpheap –type 命令,并做一些魔术来创建一个临时变量并让它指向 SOS 打印的内存地址。

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

4

2 回答 2

2

看起来与此非常相似的东西是由 Alois KrausWMemoryProfiler 项目中实现的。

于 2012-06-23T19:06:37.237 回答
1

几乎没有什么比它不得不事后猜测某种用户代码可能对查找它不拥有的根感兴趣更能拖累垃圾收集器的了。保持它尽可能活泼是至关重要的。就此而言,您能够以某种信心看到正在引用的内容的唯一方法是冻结所有可能从垃圾收集堆分配内存的线程。

嗯,这是可能的,调试器就是这样做的。您已经知道 Windbg 的做法。然而,它并没有被设计成一个为跟踪托管对象而优化的工具。还有其他工具:内存分析器。有很多选择,不要试图建立自己的。从免费软件(和浪费时间的)CLR Profiler,到诸如 Ants 和 dotTrace 等第 3 方产品。几百块钱解决你的问题,你不可能花更少的钱自己做的更好。

于 2010-06-06T22:07:45.480 回答