Delphi 使用FastMM4调试内存泄漏

Delphi 使用FastMM4调试内存泄漏,delphi,memory-leaks,Delphi,Memory Leaks,使用FastMM4并在应用程序退出时,我被告知单个关键部分发生泄漏: 21 - 36 bytes: TCriticalSection x 1 所有声明的TCriticalSection对象都经过仔细检查,并在相应的criteObj.Free()上设置了断点行。在每种情况下,“lockCount”参数均为-1。一切都井然有序 有没有可能确定这个讨厌的关键部分属于谁(或者FastMM4能帮上忙) 有没有可能确定这个讨厌的关键部分属于谁(或者FastMM4能帮上忙) 配置FastMM4,以便能够显示

使用FastMM4并在应用程序退出时,我被告知单个关键部分发生泄漏:

21 - 36 bytes: TCriticalSection x 1
所有声明的TCriticalSection对象都经过仔细检查,并在相应的
criteObj.Free()上设置了断点行。在每种情况下,“lockCount”参数均为-1。一切都井然有序

有没有可能确定这个讨厌的关键部分属于谁(或者FastMM4能帮上忙)

有没有可能确定这个讨厌的关键部分属于谁(或者FastMM4能帮上忙)

配置FastMM4,以便能够显示泄漏对象分配的堆栈跟踪。在进程关闭时,会编写一个日志文件,其中包含泄漏的详细报告,包括我描述的堆栈跟踪


一旦发现了对象的创建位置,就可以很容易地找出它没有被销毁的原因。

谢谢,好提示。我仔细查看了FastMM4创建的日志文件,我能收集到的唯一信息是TCriticalSection是由主线程分配的,特别是通过调用主窗体中的GetCurrentThreadId()返回的线程ID。其余信息是堆栈跟踪(具有6位十六进制地址)、机器代码和内存转储。您需要使用完整的FastMM和完整调试模式,使用FastMM调试dll。在FastMM4Options.inc文件中搜索对堆栈跟踪的引用,并确保启用确保生成堆栈跟踪的选项。谢谢,AFAICS设置了这些选项:(1){$define FullDebugMode}(2){$define RawStackTraces}(3)使用Process Explorer确认我的进程已加载FastMM_FullDebugMode.dll。我在此处看到堆栈跟踪。如果不完全了解所有编译选项,就很难知道缺少了什么。您正在生成完整的地图文件吗?您是否使用madexcept、eurekalog或jcldebug之类的软件?我认为fastmm将利用它们来获得堆栈跟踪符号。但如果没有这些,我相信一个完整的地图文件就足够了,IIRC。