【问题标题】:Track handle creation / deletion跟踪句柄创建/删除
【发布时间】:2010-12-17 12:17:00
【问题描述】:

我有一个大型旧程序,它有一些相当复杂的图形显示(全部通过标准 API 调用)。该程序似乎运行良好,但我最近在该程序运行时查看了 Windows 任务管理器的“句柄”字段,并注意到句柄的数量逐渐且无情地向上攀升。

我可以使用一些软件或策略来追踪这个恶意句柄的创建吗?

我希望程序会创建大量句柄,但我也希望这会达到一个限制。所以我真正想看到的是代码的哪一部分创建了最近的句柄。

编辑:在使用“Process Explorer”进行一些调查后,我发现正在蔓延的东西是“Handles”而不是“GDI Handles”。所以我想这意味着它与复杂的图形无关。

【问题讨论】:

    标签: c++ visual-studio winapi windows-xp handle


    【解决方案1】:

    请尝试this 链接以获取建议。问题很复杂,有人写了如何解决它的教程。 更新:here 是另一个可以提供帮助的链接。

    【讨论】:

    • 看起来不错,sysinternals“句柄”程序向我显示泄漏的句柄类型是“事件”句柄。但我找不到关于那是什么的解释......也许我应该开始一个单独的 SO 问题?
    • 好吧,我想浏览您的代码以进行 OpenEvent 函数调用,而无需相应的 CloseHandle 调用。机会是 - 不会有很多这样的地方(但经常调用)
    • 我的整个程序中没有一个 openevent 实例 :-(
    • CreateEvent 或 CreateEventEx 怎么样?
    • 请查看我帖子的更新。抱歉帮不上忙,对这种技术不太熟悉。
    【解决方案2】:

    处理此问题的最佳方法是使用RAII design pattern

    为您创建的每个句柄将其包装在一个类中。

    例如:

    class CAutoHandle
    {
    public:
      CAutoHandle(HANDLE handle) : m_handle(handle)
      {
      }
    
      ~CAutoHandle()
      {
        CloseHandle(m_handle);
      }
    
      HANDLE m_handle;
    };
    

    @JaredPar 还建议了另一种解决方案here,您可以在其中重新定义 CreateFile 以调用您自己的具有跟踪功能的函数。

    【讨论】:

    • 遗憾的是为时已晚 - 该程序非常古老而且非常大 - 实际上它只是最近才从 C 更改为 C++。
    【解决方案3】:

    您可以使用Memory Validator 查找句柄泄漏。试用 Eval 版本。

    【讨论】:

      【解决方案4】:

      句柄可以是很多东西,不仅是文件句柄,还包括 GUI 对象(怪癖,例如创建图标并使用 DeleteObject() 而不是 DestroyIcon() 删除它)。

      有一篇 MSDN 文章介绍了各种技术: http://msdn.microsoft.com/en-us/magazine/cc301756.aspx 和一个名为 Leaks.exe 的程序包(假设你仍然可以在 W95 下运行你的代码)

      【讨论】:

      • “请注意,本文中的工具使用了未记录且不受 Microsoft 支持的技术。”... 嗯,也许我应该说,我使用的是 XP。你认为它还会起作用吗?
      • 我认为任务管理器中的句柄计数是指内核句柄,而不是 GDI 的
      • 另一个问题是软件(leaks.exe)似乎不再可用了。
      【解决方案5】:

      创建 HANDLE 的其他函数有 CreateThread、OpenThread、CreateProcess、OpenProcess、CreateMutex、OpenMutex、LoadLibrary 和可能的 InitializeCriticalSection(不确定那个)。

      我不知道这些是否符合您正在使用的工具中的事件句柄,但它们可能值得检查。

      【讨论】:

        猜你喜欢
        • 2019-04-24
        • 2020-11-08
        • 2015-10-03
        • 1970-01-01
        • 2020-06-16
        • 2010-09-09
        • 1970-01-01
        • 2012-05-09
        • 1970-01-01
        相关资源
        最近更新 更多