我正在寻找一个 Delphi 5 程序中难以捉摸的内存问题,其中内存在客户站点被随机覆盖。在尝试了很多到目前为止都没有结果的事情之后,我现在想使用 FastMM4 的输出LogAllocatedBlocksToFile()
来找出在被覆盖区域之前立即分配了哪些对象。该程序使用计时器每 30 分钟将分配的块信息写入一个新文件。不幸的是,我的程序测试运行(DEBUG 构建)在大约 23 小时后崩溃,EOutOfMemory
但根据 MadExcept 使用分配的 1.83 GB 内存。
从 SysInternals Process Explorer 看起来,每次调用都LogAllocatedBlocksToFile()
分配但不释放内存:
CPU 使用情况图中的红色尖峰是LogAllocatedBlocksToFile()
调用。我在LogMemoryManagerStateToFile()
之前和之后添加了调用,最后一个峰值的数据(私有字节从大约 183 MB 增加到大约 218 MB)如下所示:
55054K 分配
47911K 开销
53% 效率
和这个:
55055K 分配
47910K 开销
53% 效率
因此,根据 Process Explorer,FastMM4 似乎不知道程序消耗的额外内存。
我使用的是今天从 SourceForge 下载的 FastMM4 版本 4.991。测试程序在 DEBUG 模式下运行,具有以下定义集:
全调试模式
UseCustomFixedSizeMoveRoutines
UseCustomVariableSizeMoveRoutines
NoDebugInfo
ASMVersion
DetectMMOperationsAfterUninstall
RawStackTraces
LogErrorsToFile
LogMemoryLeakDetailToFile
AlwaysAllocateTopDown
SuppressFreeMemErrorsInsideException
EnableMemoryLeakReporting
HideExpectedLeaksRegisteredByPointer
RequireDebuggerPresenceForLeakReporting
EnableMMX
Use ForceMMX
EnableBackwardCompatibleMMSha
问题:
这些功能是否有任何已知问题?我是否没有正确使用它们,是否不打算在一个调试会话中多次调用它们?有没有办法再次释放该内存?