如何在用户对象中查找泄漏

Mit*_*tch 7 .net memory-leaks user-object

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

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

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

我发现了类似的C++问题,解决方案需要从微软研究中下载一个名为"绕道"的软件包 - 捕获?$ 10K.

使用Ant内存分析器,我是SUSPECT,它与菜单有关.我们正在使用SyncFusion中的菜单,因此通过查看代码无法找到与菜单相关的内容的生命周期.所以这可能是SynFusion必须解决的错误.

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

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

欢迎提出建议

小智 1

如果您知道菜单挂在周围,您应该能够为您的进程枚举 GDI 对象,并使用DeleteMenu () 来删除它们。

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

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

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