知道使用FastMM分配内存的位置

时间:2013-01-18 01:04:39

标签: delphi fastmm

我正在尝试使用Delphi 7调试大型应用程序中的内存使用情况。我能够安装fastmm debug full dll并使用它来解决一些泄漏问题。

我还安装了内存使用跟踪器,允许我查看分配了哪些块以及它们的大小。

我的问题是,有没有办法找出块的分配位置?我知道这是可能的,因为如果没有释放内存,则会打印堆栈跟踪。有没有办法在fastmm'戳'让它打印给定分配的堆栈跟踪?

附带问题:如果分配的起始地址已知,有没有办法找出该对象是哪个类? (假设分配是针对某个对象的。

3 个答案:

答案 0 :(得分:4)

你可以:

  • 尝试使用LogAllocatedBlocksToFile程序。如果其ALastAllocationGroupToLog参数小于AFirstAllocationGroupToLog或为零,则会记录所有块及其分配调用堆栈。但是,如果您的应用程序有很多内存分配,请准备等待很长时间。我经历了大约4小时的等待时间和1.5Gb结果文件。 (旁注:使用glogg查看此类大文件)
  • 修改FastMM4.pas,以便在界面中显示实现的LogCallStack。或者您可以尝试直接从FastMM_FullDebugMode.dll
  • 使用它

关于问题:尝试使用DetectClassInstance功能。

答案 1 :(得分:2)

如果您使用FullDebugMode并启用将数据写入文件的条件,那么您应该得到您正在要求的内容。当程序关闭时,它将为每个泄漏的分配写出堆栈跟踪。 (如果你正在调试一个有很多内存泄漏的程序,这可能需要一段时间。如果泄漏的项目是一个容纳很多其他对象的容器,我似乎会使关闭持续10分钟或更长时间。)< / p>

答案 2 :(得分:2)

考虑到你在评论中说应用程序的内存在应用程序关闭时很好地清理了我的声音,你正在寻找逻辑内存泄漏 - 换句话说:生存的对象比需要但是当时间到达完成应用程序时,他们会被清理,因为存在代码来清理它们。

示例:

  • 使用Application作为所有者创建TForm,引用它的变量是Delphi在创建表单单元时创建的全局变量。
  • 将Form的CloseAction配置为caHide(在OnClose事件中)
  • 显示表单,对其进行操作
  • 关闭表单,在应用关闭之前再也不要使用它
  • 关闭应用程序,使应用程序清除其拥有的所有对象

因此,您有逻辑内存泄漏,但没有物理内存泄漏 - 这是FastMM可以轻松检测到的类型。由于您并不打算我们的假设TForm在应用程序完成之前存在,它在语义上泄露但由于它被引用并且在应用程序结束时存在破坏它的代码,因此FastMM是正常分配。

那说你不需要内存管理器的内存转储,而是内存分析器。