有没有办法通过编程来判断FastMM是否没有释放特定的内存块?
我试图检测一个内存块是否没有被释放。 当然,经理告诉我,通过对话框或日志文件,但是如果我想将结果存储在数据库中呢? 例如,我想在数据库表中有分配给定块的例程名称。
在阅读FastMM的文档之后,我知道从4.98版本开始,我们就有可能通过pipe理员通知内存分配,释放和重新分配。 例如OnDebugFreeMemFinish
事件传递给我们一个PFullDebugBlockHeader
,其中包含有用的信息。 有一件事PFullDebugBlockHeader
丢失 – 如果给定的块被应用程序释放的信息。
除非OnDebugFreeMemFinish
仅被称为未被释放的块? 这是我不知道,并希望找出。
问题是,即使挂钩到OnDebugFreeMemFinish
事件,我无法确定该块是否被释放。
这里是一个例子:
program MemLeakTest; {$APPTYPE CONSOLE} uses FastMM4, ExceptionLog, SysUtils; procedure MemFreeEvent(APHeaderFreedBlock: PFullDebugBlockHeader; AResult: Integer); begin //This is executed at the end, but how should I know that this block should be freed //by application? Unless this is executed ONLY for not freed blocks. end; procedure Leak; var MyObject: TObject; begin MyObject := TObject.Create; end; begin OnDebugFreeMemFinish := MemFreeEvent; Leak; end.
我所缺less的是这样的callback:
procedure OnMemoryLeak(APointer: PFullDebugBlockHeader);
在浏览FastMM的源码之后,我看到有一个过程:
procedure LogMemoryLeakOrAllocatedBlock(APointer: PFullDebugBlockHeader; IsALeak: Boolean);
可以重写,但也许有一个更简单的方法?
即使这样的处理程序存在,它几乎是无用的,因为FastMM报告泄漏时,包括数据库在内的所有内容都将被closures。
所以,我build议你在FastMM4Options.inc
打开LogErrorsToFile
和FullDebugMode
条件。 这会给你一个泄漏的文本文件,以后你可以parsing并放入数据库。