【问题标题】:How can I identify what handles this process has open?如何确定此进程已打开哪些句柄?
【发布时间】:2015-10-14 16:18:26
【问题描述】:

我正在调试我们的一个服务器进程的问题,该进程在 60-90 天内消耗大量句柄。服务器父进程产生并循环许多子进程,每个子进程大约每小时回收一次。父进程句柄计数将在两个月内上升到 40k 加,但我不确定句柄到底引用了什么。

使用 ProcessExplorer,我可以看到句柄计数和列出的句柄数量(下图是一个示例)。但是,列出的句柄数量并不接近上窗格中显示的 40k 数量。我在句柄窗口中有大约 100 个条目,通过查看它们的属性,我可以使用这个窗口占总句柄的大约 3k,与总共 40k 相去甚远。

我已将父进程设置为每隔几分钟循环一次子进程,以尝试查看它是否与循环子进程有关,但监控一个小时似乎并没有导致父进程句柄计数上升.在此期间它会上下波动,但不会呈上升趋势。诚然,一个小时与两个月相去甚远,但这只是一个开始。

我非常感谢有关如何进一步解决此问题的一些指导。不幸的是,这超出了我的常识,所以我有点迷茫。在确定可能包含此句柄计数的内容时,我们将不胜感激。

更新:根据下面josh poley 的建议,我使用来自 Sysinternals 的handle.exe 来检查该过程。使用 -a 标志,我只得到 5 个结果。所以接下来我尝试了-s 标志,它列出了所有进程的句柄数。我运行了一次,然后重新启动了受影响的服务器并再次运行它。突变手柄类别急剧下降,这让我觉得我需要专注于那里。会研究

【问题讨论】:

  • 暗中乱拍:在处理spawning children和泄露handle时,一个典型的问题是lpProcessInformation中CreateProcess提供的两个handle没有关闭,不妨看看。

标签: windows handle


【解决方案1】:

Process Explorer 中的句柄视图并未显示所有可能的句柄类型(仅显示常用的句柄类型,它可以提供有用的详细信息)。

您应该使用 handle.exe(也来自 sysinternals 集)和 -a 选项以及您的进程 ID,然后解析输出。示例:

handle.exe -a -p 26916 >handle.out

只是在我的盒子上选择一个随机进程,handle.exe 显示了 795 个 EtwRegistration 句柄,这些句柄没有显示在 Process Explorer GUI 中。

【讨论】:

  • 所以我查看了 handle.exe,并使用 -a 选项我的进程只得到了 5 行输出。但是,使用 -s 选项,我得到了所有进程中所有句柄的计数。我重新启动了我的服务,然后再次运行它,看起来句柄类型是 Mutant ,这是我的问题。我会进一步研究。
猜你喜欢
  • 1970-01-01
  • 2012-02-19
  • 2016-09-24
  • 1970-01-01
  • 1970-01-01
  • 2011-04-03
  • 1970-01-01
  • 2014-12-26
相关资源
最近更新 更多