2011-03-18 57 views
4

我有一个程序泄漏的USER对象可以在任务管理器中看到。有没有办法确定哪种资源正在泄露?我已经使用GDI View等程序来处理GDI泄漏,并按对象类型对其进行分解。对于USER对象有没有类似的东西?如何追踪Windows USER对象泄漏?

+1

指定要用于跟踪它们的Windows版本会很有帮助。举个例子,Windows 7带有一些内置工具,可以提供帮助。我个人更喜欢使用AQTime作为分析器,它具有这些“泄漏检测”功能。 – 0xC0000022L 2011-03-18 17:06:50

+0

我正在运行Windows 7.我应该寻找哪些内置工具? – Ryand 2011-03-18 17:18:09

+0

我一直在思考Application Verifier的问题,但是我的记忆使我失望,认为只有堆问题。但是,ETW(Windows事件跟踪)可能是一条合适的路线。对困惑感到抱歉。 – 0xC0000022L 2011-03-18 17:40:46

回答

0

有一个名为windbg的调试器。它可以做这些事情,但学习曲线是惊人的。

+0

我以前使用过WinDgb,但我不知道如何跟踪这样的事情。 – Ryand 2011-03-18 15:58:14

+1

我发现windbg的leaktrap插件是我所需要的。 [http://code.google.com/p/leaktrap/](http://code.google.com/p/leaktrap/)我的泄漏竟然是菜单对象。 – Ryand 2011-03-23 13:36:50

2

您可以通过钩住Create/DestroyWindow来追踪窗口句柄泄漏,然后追踪传递的句柄。通过这种方式,您可以使用ETW轻松生成WPA中的图表,其中尚未删除的多余句柄不会被删除。

http://geekswithblogs.net/akraus1/archive/2016/01/30/172079.aspx

随着我EasyHook的叉它的工作原理也针对x64在Win 8和更高版本。 下面是一个使用ETWStackwalk.exe创建的图像,它是我的EasyHook分支的一部分。使用WPA,您可以通过检查AllocSize列的值> 0来查看所有打开和关闭以及哪些窗口仍处于打开状态。 然后筛选仍然处理程序处于打开状态的事件,并直接调用它分配但未分配的调用堆栈至今。

enter image description here

如果你是刷或字体后,你需要为你怀疑负责对泄漏的方法,延长刀具。只要您知道哪些方法可能会造成泄漏,并且您能够锁定资源分配和免费呼叫,所提出的方法就能够解决任何资源泄漏问题。