如何追踪Windows用户对象泄漏?

4

我有一个程序泄漏了USER对象,在任务管理器中可以看到。有没有办法确定正在泄漏的资源类型?我已经使用了像GDI View这样的程序来检测GDI泄漏,它会按对象类型进行拆分。是否有类似于此的东西用于USER对象?


1
指定您要使用的Windows版本以跟踪它们会很有帮助。例如,Windows 7自带一些可帮助您的内置工具。我个人更喜欢使用 AQTime 作为分析器,它具有“泄漏检测”功能。 - 0xC0000022L
我正在运行Windows 7操作系统。有哪些内置工具可以使用? - Ryand
我之前考虑使用应用程序验证器,但是我记忆中只有它针对堆栈问题。ETW(Windows事件跟踪)可能是一种合适的方法。对于造成的困扰,请原谅我的混淆。 - 0xC0000022L
1
用户对象是窗口和菜单。泄漏它们相当不寻常,因此工具并不那么容易获得。Spy++可以显示窗口。 - Hans Passant
2个回答

2
您可以通过钩取Create/DestroyWindow并跟踪传递的句柄来追踪Window Handle泄漏。这样,您可以很容易地生成一个WPA中的图形,其中尚未删除的多余句柄保持不变。请参见http://geekswithblogs.net/akraus1/archive/2016/01/30/172079.aspx
使用我的EasyHook分支,它也适用于Win 8及更高版本的x64。下面是使用ETWStackwalk.exe创建的图像,该文件是我的EasyHook分支的一部分。使用WPA,您可以查看所有已打开和已关闭的窗口,并通过检查AllocSize列中的值> 0来确定哪些窗口仍然打开。然后过滤仍然具有打开句柄的事件,您将直接获得已分配但尚未释放的调用堆栈。

enter image description here

如果你想要获取刷子或字体,你需要扩展该工具,针对你认为可能导致资源泄漏的方法。所提出的方法可以解决任何资源泄露,只要你知道哪些方法被怀疑会创建泄漏,并且能够挂钩资源分配和释放调用。

0

有一个名为windbg的调试器。它可以做这些事情,但学习曲线非常陡峭。


我以前用过WinDbg,但我不知道如何追踪这样的东西。 - Ryand
1
我发现windbg的leaktrap插件正是我所需的。http://code.google.com/p/leaktrap/ 我的泄漏问题最终被识别为菜单对象。 - Ryand

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接