调用FastMM4 LogAllocatedBlocksToFile()是否会定期占用内存空间?

时间:2014-03-17 17:55:17

标签: delphi delphi-5 fastmm

我在Delphi 5程序中寻找难以捉摸的内存问题,其中内存在客户站点被随机覆盖。在尝试了很多没有结果的事情之后,我现在想要使用LogAllocatedBlocksToFile()的FastMM4输出来找出在覆盖区域之前立即分配的对象。该程序使用计时器每30分钟将分配的块信息写入新文件。不幸的是,我的测试运行程序(DEBUG构建版)在大约23个小时后发生EOutOfMemory异常崩溃,根据MadExcept使用1.83 GB的分配内存。

从SysInternals Process Explorer看,它看起来像是LogAllocatedBlocksToFile()的每个调用分配但不释放内存:

Process Explorer screen shot of a 100 minutes program run

“CPU使用率”图中的红色峰值是LogAllocatedBlocksToFile()次调用。我之前和之后都添加了对LogMemoryManagerStateToFile()的调用,最后一个峰值的数据(私有字节从大约183 MB增加到大约218 MB)看起来像这样:

  

55054K已分配
  47911K架空灯
  效率为53%

和此:

  

55055K已分配
  47910K架空灯
  效率为53%

所以FastMM4似乎没有意识到程序根据Process Explorer消耗的额外内存。

我正在使用FastMM4的4.991版本,今天从SourceForge下载。测试程序在DEBUG模式下运行,下面定义了set:

  

FullDebugMode

     

UseCustomFixedSizeMoveRoutines
  UseCustomVariableSizeMoveRoutines
  NoDebugInfo
  ASMVersion
  DetectMMOperationsAfterUninstall
  RawStackTraces
  LogErrorsToFile
  LogMemoryLeakDetailToFile
  AlwaysAllocateTopDown
  SuppressFreeMemErrorsInsideException
  EnableMemoryLeakReporting
  HideExpectedLeaksRegisteredByPointer
  RequireDebuggerPresenceForLeakReporting
  EnableMMX
  ForceMMX   EnableBackwardCompatibleMMSharing
  UseOutputDebugString

问题:

这些功能有任何已知问题吗?我没有正确使用它们,是否打算在一次调试会话中多次调用它们?有没有办法再次释放内存?

1 个答案:

答案 0 :(得分:4)

简短版:

我已将此跟踪为支持库FastMM_FullDebugMode.dll的版本不匹配。

旧版本的库适用于编译到可执行文件中的较新版本。似乎没有检查版本是否匹配。但是,模块在运行时并不能真正协同工作。

长版:

该项目最初使用的是FastMM4的旧版本4.97,我在此处与支持库(文件版本1.44.0.4,产品版本1.42)一起检查。

在尝试查找程序中的错误时,我已将FastMM4升级到版本4.991。我还记得将新的支持库(文件版本1.61.0.6,产品版本1.60)复制到构建目录。但是,一段时间后我必须将其从目录中删除,或者我将其复制到错误的目录开始,因为两个小时前我检查了应用程序加载的模块,发现应用程序已经拿起旧版本的来自另一个目录的支持库,因为它不在构建目录中。

由于在那里复制并重新启动应用程序,问题似乎已经消失。调用LogAllocatedBlocksToFile()时,内存使用量不会增加。

也许这对某人有帮助,所以我回答这个问题而不是删除问题。

开启调试......