1

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

4

5 回答 5

3

您可能可以使用 FastMM4 执行此操作,但这会很复杂。尝试检查过程 ScanForMemoryLeaks 的代码,看看它是如何完成的。

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

于 2009-06-21T12:59:14.707 回答
1

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

于 2009-06-21T19:37:13.477 回答
0

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

于 2009-06-23T08:10:17.510 回答
0

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

FWIW 我在 Delphi 4/5 天实现了一个框架,其中包含一个检测基类,该基类可以选择跟踪对象的创建/销毁。这对于追踪对象泄漏等非常有效,但会产生大量信息。如果您只需要知道关闭时泄漏了哪些对象,FASTMM4 是一个更好的选择。

于 2009-06-23T05:37:18.427 回答
0

这是一个应该有所帮助的想法,没有完全尝试过,但它会让你走得更远:

按以下方式编写类助手:

  1. 使用构造函数编写一个通用的 Tobject 类助手。

  2. 为覆盖其构造函数的类编写自定义/特定类帮助器。

  3. 使用自由方法编写通用 Tobject 类助手。

  4. 为覆盖其免费方法的类编写自定义/特定类帮助器。

  5. 最后检查所有代码是否调用 .Free,如果不将其从 .Destroy 更改为 .Free。如果您希望从列表中删除所有对象。

  6. 在您想要列出的每个单元中包含带有类助手的单元。

  7. 还要在该单元中创建全局列表。

在构造函数中简单地写

继承创建;

GlobalObjectList.Add(自我);

在免费方法中写:

GlobalObjectList.Remove(自我);

继承免费;

这可能不是线程安全的,并且对于使用泛型或泛型方法的某些初始化可能会失败,泛型在这里和那里似乎仍然有些错误,因此您的里程也可能与临界区和/或线程有关。

于 2022-01-30T23:48:25.473 回答