【问题标题】:How do I fix this memory leak while using Chromium Embedded?如何在使用 Chromium Embedded 时修复此内存泄漏?
【发布时间】:2023-04-01 11:10:01
【问题描述】:

Chromium Embedded (https://code.google.com/p/delphichromiumembedded/) 的 GuiDemo 代码泄漏了几个字节的内存。不多,但每次停止应用程序时从 FastMM 收到该消息是非常烦人的。我猜泄漏是在 Chromium 接口中。 该单元有一个初始化部分:

INITIALIZATION
 CefCache := 'cache';
 CefRegisterCustomSchemes := CefOnRegisterCustomSchemes;
 CefRegisterSchemeHandlerFactory('dcef', '', True, TFileScheme);

日志是这样的:

A memory block has been leaked. The size is: 20

This block was allocated by thread 0x1674, and the stack trace (return addresses) at the time was:
40455E 
4050A7 
409C1D 
405622 
4050DC 
4F0D7A 
406598 
406604 
40A6C3 
4F0E28 
764CEE1C [BaseThreadInitThunk]

The block is currently used for an object of class: main$174$ActRec
The allocation number is: 323

--------------------------------2014/10/5 17:11:33--------------------------------
This application has leaked memory. The small block leaks are (excluding expected leaks registered by pointer):
13 - 20 bytes: main$174$ActRec x 1

问题是我不知道 main$174$ActRec 是谁。 托管演示的单元确实称为“main.pas”。但是没有其他 var 称为 'main'。

【问题讨论】:

  • 为什么有人反对这个?这是一个完全合理的问题,尽管对正在发生的事情缺乏了解。单例会泄漏一点内存,而且没有清理功能,这并不奇怪。
  • SO 社区倾向于对成员无法回答的问题投反对票,因为他们认为错误可能只存在于问题中。 SO 社区也倾向于对成员能够回答的问题投反对票,因为他们认为提问者没有表现出她/他自己解决问题的努力。对于 Delphi 问题尤其如此。

标签: delphi delphi-xe


【解决方案1】:

main$174$ActRec 与用于支持匿名方法的接口相关联。因此,这应该可以为您提供如何查找泄漏的线索。

如果您包含一个异常记录套件,例如 madExcept、JCL 的 EurekaLog,您将从 FastMM 获得有意义的堆栈跟踪。这也将帮助您找到泄漏的来源。

一旦您可以找到已泄露的内容,那么应该有可能找到一种方法将其注册为预期的泄露。但是,如果您能确定泄露的内容,那么我建议您设法找到不泄露的方法。

由于您没有提供更多信息,因此我无法帮助您进一步识别泄漏。这个项目有很多demo,不知道你跑的是哪一个。

【讨论】:

  • 好像是 GUIClient 演示。
  • 确实是GUI客户端演示。
  • 好吧,你现在知道要找什么了
  • @Altar 你在寻找更多吗?请记住,我仍然不知道您正在运行什么代码,因为我不知道您使用的是哪个版本的演示或您使用的是哪个版本的 Delphi。您确实应该获得不错的堆栈跟踪并识别 anon 方法。
  • 嗨,David - 我正在使用的演示名为“guiclient”。这是我几天前从他们的网站下载的最新版本(我认为是 2012 年 5 月)。我使用德尔福 XE。正如你所说,我会得到一个堆栈跟踪。
【解决方案2】:

错误是告诉您内存块拥有main$174$ActRec 类的实例,而不是main$174$ActRec 类分配的内存。在您的应用程序的某处,正在调用 ActRec.Create(),但未调用 ActRec.Destroy()。由于您不知道被泄漏对象的确切内存地址,或者至少不知道指向该对象的变量的内存地址,因此您无法通过地址注册它。但是,FastMM 的完整版有一个重载的RegisterExpectedMemoryLeak() 函数,它接受一个类类型并计为输入。这允许您在 FastMM 开始将它们报告为泄漏之前告诉 FastMM 允许泄漏多少类类型的实例。当然,这意味着您需要访问类类型。如果它是 Chromium 内部的东西,你可能会不走运。

【讨论】:

  • $ 符号使它成为一个“难以形容的”名称。只有编译器可以实例化这个东西。
猜你喜欢
  • 2020-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多