【问题标题】:How do I track down a Windows USER object leak?如何追踪 Windows USER 对象泄漏?
【发布时间】:2011-03-18 14:17:37
【问题描述】:

我有一个程序正在泄漏可以在任务管理器中看到的 USER 对象。有没有办法确定泄漏的是哪种类型的资源?我已经使用 GDI View 之类的程序来处理 GDI 泄漏,它按对象类型将其分解。 USER 对象有什么类似的吗?

【问题讨论】:

  • 指定要用于跟踪它们的 Windows 版本会很有帮助。一方面,Windows 7 附带了一些可以提供帮助的内置工具。我个人更喜欢使用 AQTime 作为分析器,它具有“泄漏检测”功能。
  • 我运行的是 Windows 7。我应该寻找哪些内置工具?
  • 我一直在考虑应用程序验证程序,但我的记忆让我失望了,它只用于堆问题。不过,ETW(Windows 事件跟踪)可能是一条合适的路线。很抱歉造成混乱。
  • USER 对象是窗口和菜单。泄漏它们是相当不寻常的,因此工具并不那么容易获得。 Spy++ 向您展示窗口。

标签: c++ windows visual-studio winapi resource-leak


【解决方案1】:

您可以通过挂钩 Create/DestroyWindow 来跟踪窗口句柄泄漏,然后跟踪传递的句柄。这样,您可以轻松地使用 ETW 跟踪 WPA 中的图形,其中尚未删除的多余句柄不会被删除。

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

使用我的 EasyHook 分支,它也适用于 Win 8 及更高版本的 x64。 下面是使用 ETWStackwalk.exe 创建的图像,它是我的 EasyHook fork 的一部分。使用 WPA,您可以通过检查 AllocSize 列的值 > 0 来查看所有打开和关闭的窗口以及哪些窗口仍处于打开状态。 然后过滤仍然打开句柄的事件,您可以直接获得分配但迄今为止从未释放的调用堆栈。

如果您使用画笔或字体,则需要扩展工具以使用您怀疑导致泄漏的方法。只要您知道哪些方法可能会造成泄漏,并且您能够挂钩资源分配和空闲调用,所提出的方法就能够解决任何资源泄漏。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我以前用过WinDgb,但我不知道如何跟踪这样的东西。
    • 我发现 windbg 的泄漏陷阱插件正是我所需要的。 http://code.google.com/p/leaktrap/我的泄漏原来是菜单对象。
    猜你喜欢
    • 2017-08-30
    • 2011-02-15
    • 2012-12-21
    • 1970-01-01
    • 2018-02-24
    • 1970-01-01
    • 1970-01-01
    • 2012-03-17
    • 2012-07-01
    相关资源
    最近更新 更多