Delphi Lazarus内存泄漏,如何使用Heaptrcon调试它们?
在Delphi XE中,我总是使用Delphi Lazarus内存泄漏,如何使用Heaptrcon调试它们?,delphi,memory-leaks,freepascal,lazarus,Delphi,Memory Leaks,Freepascal,Lazarus,在Delphi XE中,我总是使用ReportMemoryLeaksOnShutDown在退出应用程序时检测任何泄漏,我的大多数项目都非常小,查找泄漏通常并不太困难 在Lazarus没有这样的选项,但我刚刚发现了一个名为Heaptrcon的选项,更多信息见本页: 在项目选项>链接中,我设置了(-gh)标志,现在我对任何泄漏的担心已经成为现实。我会发布代码,但因为有很多不同的类和单元,我不知道从哪里开始修复这些漏洞,这是一个比我所从事的任何其他项目都要大得多的项目 这是一些泄漏的屏幕截图: 我的
ReportMemoryLeaksOnShutDown
在退出应用程序时检测任何泄漏,我的大多数项目都非常小,查找泄漏通常并不太困难
在Lazarus没有这样的选项,但我刚刚发现了一个名为Heaptrcon的选项,更多信息见本页:
在项目选项>链接中,我设置了(-gh)标志,现在我对任何泄漏的担心已经成为现实。我会发布代码,但因为有很多不同的类和单元,我不知道从哪里开始修复这些漏洞,这是一个比我所从事的任何其他项目都要大得多的项目
这是一些泄漏的屏幕截图:
我的调试技能几乎为零,到目前为止,我已经查看了我创建的每个对象或类,然后检查它是否已被释放。因为我正在处理很多TList和指针/对象等,所以泄漏可能来自我猜的任何地方
是否有任何线索或提示可以从哪里开始寻找?我正在查看大小为16的每个块的调用堆栈,其中有6个,这是否意味着有6个对象未正确销毁
我不知所措,从哪里开始
提前感谢。您真正需要的信息是与每个泄漏对象关联的分配的堆栈跟踪。它们出现在屏幕截图中,但显示为地址而不是函数名。启用调试信息,名称将显示给您。然后,您可以像在Delphi中使用FastMM一样跟踪问题。正如David Heffernan在其早期评论中提到的,应该有一种方法将这些地址转换为函数名 第一步是确保我已经为GDB启用了
generateddebuginginfo
,但由于某些原因没有启用,然后我得到了那些函数名
在追踪地址后,他们引导我找到我的TList对象。现在,我正在处理的这个项目实际上是在Delphi XE中启动的,但我正在将其移植到Lazarus,这些错误在XE中没有被发现,但在释放我的TList对象时,我做了以下操作:
var
P: Pointer;
begin
for P in MyList do TMyListItem(P).Free;
end;
我没有安装XE进行测试,但我记得上面没有错误
我还在树视图中添加对象(这些对象是MyList
中的指针),但我并没有释放这些对象。但即使这样做了,我的泄密仍然存在
经过数小时的尝试和接近放弃,我意识到我错过了一些简单的东西:
var
P: Pointer;
begin
for P in MyList do TMyListItem(P).Free;
MyList.Free;
end;
我在德尔福错过了这一部分,我确信它没有抱怨任何泄漏,但在拉扎勒斯/FPC我得到了大量新的泄漏。到目前为止,我所有的泄密都消失了(希望如此),再也不会回来了
现在我得到了这个泄漏报告,它看起来不那么可怕,因为它报告了zero
泄漏:
您确实需要将这些地址转换为函数名。“FPC肯定有办法做到这一点。”大卫·费弗南我不知道,我需要看看这是否可能,它是否能帮上大忙。编辑:我关闭了调试信息,现在我有了函数名。我真的很想自己尝试解决这个问题,所以如果我能暂时搁置这个问题,也许……?“Lineinfo”(-gl)是要注意的FPC参数。@MarcovandeVoort我发现到处都是漏洞,整天都在试着调试它们。我似乎修复了加载,然后新的加载开始出现:(我所知道的memprofiling(Delphi除外)的唯一问题是主程序中的内存泄漏并不总是被正确检测到。(请注意,在单元的最终确定顺序中存在错误或变量,包括一只手的内存单元和主程序本地的全局变量的最终确定)请确保树视图不会释放节点中的对象。数据感谢分享您的经验!