Winapi ::获取可用的句柄数

se_*_*vel 3 winapi handle

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

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

Han*_*ant 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.在程序执行时,您将获得三组句柄类型的句柄计数的实时更新,并在调试代码时立即反馈.