【问题标题】:How to find a leak in User Objects如何在用户对象中查找泄漏
【发布时间】:2011-09-08 00:47:24
【问题描述】:

我们的 .Net 4.0 应用程序存在泄漏,导致它在长时间使用后崩溃。经过调查,我确定“用户对象”正在泄漏。 User 对象是一个 Windows 资源,如下所述:

http://msdn.microsoft.com/en-us/library/ms725486%28v=VS.85%29.aspx

Windows 为每个进程分配 10,000 个用户对象。其他 Windows 资源(例如 GDI 对象和句柄)在应用程序运行时是不变的。

我发现了一个关于 C++ 的类似问题,解决方案需要从 microsoft reseach 下载一个名为“detours”的包 - 问题是什么? 1 万美元。

使用 Ant 内存分析器,我怀疑它与菜单有关。我们使用的是来自 SyncFusion 的菜单,因此通过查看代码无法找到与菜单相关的东西的生命周期。所以这可能是 SynFusion 必须解决的一个 bug。

任何人在使用 SyncFusion 菜单时遇到过类似的泄漏? Ants 告诉我一些 PopupMenu 对象仍然存在,但 Ants 没有提供有关如何查找对象创建位置的信息(从而确定在何处处置它们)。

上面引用的 SO 帖子中提到的泄漏陷阱/detours 看起来很有趣,因为它似乎捕获了对 USER 对象分配的特定调用。

欢迎提出建议

【问题讨论】:

  • 我将开始查看您自己在代码中创建的菜单。也许在onchange 事件中创建右键菜单或类似的东西覆盖您的另一个菜单。我过去曾与 syncfusion Edit 发生过泄漏,在解决这些问题时,似乎对正确处理非常严格。

标签: .net memory-leaks user-object


【解决方案1】:

如果您知道菜单到处都是,您应该能够为您的进程枚举 GDI 对象并使用 DeleteMenu() 对它们进行更新。

当弹出菜单显示和关闭时,窗口应该通知您的父窗口,这样将是拍摄 GDI 菜单句柄快照并删除较新菜单句柄的理想场所。

它相当蛮力,不推荐用于 .net,因为这种低级 GDI 操作可能很顽皮

我会用 SyncFusion 菜单制作一个简单的测试应用程序来证明这一点,如果问题仍然存在,请联系供应商

【讨论】:

    猜你喜欢
    • 2020-12-20
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多