2

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

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

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

编辑:在对“进程资源管理器”进行一些调查后,我发现正在蔓延的是“句柄”而不是“GDI 句柄”。所以我想这意味着它与复杂的图形无关。

4

5 回答 5

3

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

于 2009-11-17T16:19:58.697 回答
0

处理这个问题的最好方法是使用RAII 设计模式

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

例如:

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

  ~CAutoHandle()
  {
    CloseHandle(m_handle);
  }

  HANDLE m_handle;
};

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

于 2009-11-17T16:01:57.770 回答
0

您可以使用内存验证器来查找句柄泄漏。试试评估版。

于 2009-11-17T16:08:17.130 回答
0

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

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

于 2009-11-17T16:13:33.690 回答
0

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

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

于 2009-11-17T18:24:07.610 回答