Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi Lazarus内存泄漏,如何使用Heaptrcon调试它们?_Delphi_Memory Leaks_Freepascal_Lazarus - Fatal编程技术网

Delphi Lazarus内存泄漏,如何使用Heaptrcon调试它们?

Delphi Lazarus内存泄漏,如何使用Heaptrcon调试它们?,delphi,memory-leaks,freepascal,lazarus,Delphi,Memory Leaks,Freepascal,Lazarus,在Delphi XE中,我总是使用ReportMemoryLeaksOnShutDown在退出应用程序时检测任何泄漏,我的大多数项目都非常小,查找泄漏通常并不太困难 在Lazarus没有这样的选项,但我刚刚发现了一个名为Heaptrcon的选项,更多信息见本页: 在项目选项>链接中,我设置了(-gh)标志,现在我对任何泄漏的担心已经成为现实。我会发布代码,但因为有很多不同的类和单元,我不知道从哪里开始修复这些漏洞,这是一个比我所从事的任何其他项目都要大得多的项目 这是一些泄漏的屏幕截图: 我的

在Delphi XE中,我总是使用
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除外)的唯一问题是主程序中的内存泄漏并不总是被正确检测到。(请注意,在单元的最终确定顺序中存在错误或变量,包括一只手的内存单元和主程序本地的全局变量的最终确定)请确保树视图不会释放节点中的对象。数据感谢分享您的经验!