Winapi ::获取可用的句柄数

时间:2013-03-07 12:28:37

标签: winapi handle

我想创建长时间运行程序的测试,并不时输出可用句柄的数量。如何使用某个WINAPI函数执行此操作?

这是一篇关于如何调试句柄泄漏的精彩文章 http://blogs.technet.com/b/yongrhee/archive/2011/12/19/how-to-troubleshoot-a-handle-leak.aspx 但它不适合我的情况。我不知道如何在我的测试中自动化调试器。

1 个答案:

答案 0 :(得分:7)

这不是它的工作原理。您可以使用的句柄数量受配额限制,默认情况下为10,000个句柄。有三种类型的句柄,每种句柄都有自己的配额:

  • 内核句柄,由kernel32.dll导出的函数返回。文件,管道,套接字,同步对象等。识别它们的最佳方法是通过它们的发布方式,内核句柄总是需要CloseHandle()。超出配额的内核句柄数没有硬上限,当内核内存池空间不足时发生故障

  • user32句柄,窗口和菜单对象。超出配额,可以在一个桌面会话中分配的句柄数存在硬上限。在同一桌面上运行的所有进程的所有user32句柄的总和不能超过上限,它认为是65535句柄

  • gdi句柄,设备上下文和绘图对象,如位图和画笔等。超出配额时,它将受到与user32处理相同的硬上限。

当程序消耗三个配额限制中的一个时,程序将始终失败。但是如果其他进程消耗了大量的user32或gdi对象,或者内核内存池处于压力之下,则可能会提前失败。

理智的做法是不记录仍然可用的句柄数量,你找不到,而是记录你消耗了多少句柄。您可以调用GetGuiResources()来跟踪消耗的user32和gdi句柄的数量。 GetProcessHandleCount()返回用于进程的内核句柄数。

但是,最简单的方法是使用任务管理器,进程选项卡,而不是编写代码。使用View + Select Columns,在Windows 8上右键单击列标题,然后勾选Handles,User Objects和GDI Objects。在程序执行时,您将获得三组句柄类型的句柄计数的实时更新,并在调试代码时立即反馈。