如何列出所有实例化对象?

时间:2009-06-21 11:39:13

标签: delphi memory delphi-7 fastmm

如何使用FASTMM4或默认内存管理器列出所有应用程序中的所有实例化对象?

4 个答案:

答案 0 :(得分:3)

你可以用FastMM4做到这一点,但这会很复杂。尝试检查ScanForMemoryLeaks过程的代码,看看它是如何完成的。

此例程根据预期的内存泄漏列表检查所有已分配的堆内存,并报告显示的所有内容,包括计数和对象类名称(如果找到对象)。您要做的是检查所有已分配的堆内存并报告您找到的所有对象的计数和对象类名称,因此这是一个非常类似的任务。只需省略已注册的指针列表检查并过滤掉不是对象的所有内容。

答案 1 :(得分:1)

好吧它不受支持而且不受鼓励,但根据你的情况,你可以编辑TObject来记录创建和销毁 - 因为所有对象都是TObject,这可能会有所帮助。然而修改VCL真的很不受欢迎,所以我想你可以使用Helper对象(自2006年以来可用)来做同样的事情。写入另一个列表等,其中包含每个对象的详细信息。

答案 2 :(得分:0)

实现Tony Allen建议的有趣方法可能是在运行时挂钩对象创建和销毁方法。 Google Code上有一个有趣的库,它是AsmProfiler项目的一部分(一个非常好的工作恕我直言)可能会有所作为。这是KOLDetours单位的链接,可以完成所有繁重的任务。

FWIW我在Delphi 4/5天实现了一个框架,其中包含一个可选跟踪对象创建/销毁的检测基类。这适用于跟踪对象泄漏等,但产生了大量信息。如果你需要知道的是关闭时对象泄漏的话,FASTMM4是一个更好的选择。

答案 3 :(得分:0)

您可以通过调用SetMemoryManager来更改内存管理器。 您可以编写自己的MM,这将是一个简单的存根:它将所有调用重定向到旧MM(这是FastMM,您可以通过调用GetMemoryManager获取它)并在某处记录所有内存操作。 您可以通过查看调用堆栈来检测对象创建/销毁:应该从TObject的NewInstance方法调用。