跟踪句柄创建/删除

时间:2009-11-17 15:45:03

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

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

我是否可以使用一些软件或策略来追踪这个流氓手柄的创建?

我希望该程序能够创建大量句柄,但我也希望它能达到极限。所以我真正想看到的是代码的哪一部分正在创建最新的句柄。

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

5 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

解决此问题的最佳方法是使用RAII design pattern

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

例如:

class CAutoHandle
{
public:
  CAutoHandle(HANDLE handle) : m_handle(handle)
  {
  }

  ~CAutoHandle()
  {
    CloseHandle(m_handle);
  }

  HANDLE m_handle;
};

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

创建HANDLE的其他函数是CreateThread,OpenThread,CreateProcess,OpenProcess,CreateMutex,OpenMutex,LoadLibrary以及可能的InitializeCriticalSection(不确定那个)。

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