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

mgh*_*hie 2 delphi delphi-5 fastmm

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

在SysInternals Process Explorer中,它看起来像每次LogAllocatedBlocksToFile()分配调用,但不会释放内存:

运行100分钟的程序的Process Explorer屏幕快照

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

55054K分配的
47911K开销
53%的效率

和这个:

55055K分配的
47910K开销
53%的效率

因此,根据Process Explorer,FastMM4似乎不知道程序占用的额外内存。

我使用的是FastMM4的4.991版本,今天已从SourceForge下载。测试程序以DEBUG模式运行,并设置了以下定义:

FullDebugMode

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

问题:

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

mgh*_*hie 5

简洁版本:

我已将其归结为支持库的版本不匹配 FastMM_FullDebugMode.dll

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

长版:

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

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

由于将其复制并重新启动应用程序,问题似乎消失了。LogAllocatedBlocksToFile()调用时,内存使用不会增加。

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

调试中...