如何追踪句柄泄漏?

8
在我的一个应用程序中,我观察到句柄数量在增加。即使没有使用该应用程序,每秒钟句柄数量也会增加,因此在某些后台处理代码中必须存在句柄泄漏。
如何跟踪这种泄漏?有哪些工具可以帮助解决这个问题?在跟踪句柄泄漏时需要注意哪些模式?导致句柄泄漏的最常见错误是什么?
虽然有很多问题,但我希望它们足够相关,可以放在一个问题中。提前感谢您的任何意见!
3个回答

8

我建议使用Process Explorer。以管理员身份运行它,确保您看到所有相关数据。在那里,您可以观察您的进程具有哪些句柄,并且哪些句柄被过度创建而没有被释放。这应该有助于缩小搜索范围(在我的情况下,由于对winsocks行为的错误假设,我的套接字泄漏了很多)。然后,您可以隔离相关代码并在此处发布以供我们检查是否存在任何问题。祝你好运!


+1 谢谢!我知道ProcessExplorer,但还没有用它来解决这个问题。泄漏的句柄是区段句柄。请参见我的后续问题:https://dev59.com/B1zUa4cB1Zd3GeqP3HLu - jpfollenius

5

一些性能分析工具(例如AQTime)可以对Windows资源应用程序进行分析。如果您正在使用XE,则有一个基本版本的AQTime可用。

如果执行路径没有正确关闭句柄,则会出现句柄泄漏,但在Windows中,句柄是在很多不同情况下使用的常见项目,您的应用程序泄漏哪种类型的句柄?


+1 谢谢!我必须尝试 AQTime。结果发现我的应用程序正在泄漏部分句柄。请查看后续问题:https://dev59.com/B1zUa4cB1Zd3GeqP3HLu - jpfollenius
1
像AQTime这样的分析工具可以告诉你泄漏句柄的创建位置。使用Process Explorer则会更加困难,因为它可以显示调用堆栈,但它不会像AQTime那样记录信息 - 尽管AQTime因此而更“沉重”。您还可以尝试使用Process Monitor,它实际上记录了许多这些调用。无论如何,如果您有像AQTime这样的分析工具可用,我认为这是完成此类任务的最佳工具。当您必须检查无法安装AQTime或类似工具的系统时,PE / PM是非常有价值的工具。 - user160694

2
  1. 在win10中,下载工具“Handle”: https://learn.microsoft.com/en-us/sysinternals/downloads/handle

  2. 用法:

    handle [[-a] [-u] | [-c [-l] [-y]] | [-s]] [-p |> [name]

  3. 示例:

    显示进程33920中所有类型的句柄及其计数: 在cmd中运行“handle64 -s -p 33920”

  4. 结果如下图所示:

enter image description here

  1. 重复步骤3多次,检查差异并获取内存激增的部分。

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