2013-03-07 98 views
3

我想创建一个长时间运行我的程序并输出可用句柄数的测试。我怎样才能用WINAPI函数做到这一点?Winapi ::获取可用的句柄数

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

+1

您是否想要问如何在您的过程中获取_open_句柄的数量?由于_available_句柄的数量(大约[16.7百万](http://blogs.technet.com/b/markrussinovich/archive/2009/09/29/3283844.aspx))没有太大帮助,因此我的想法。 – Damon 2013-03-07 13:06:20

+0

你说得对,问题是关于打开的句柄 – 2013-03-07 16:55:55

回答

7

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

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

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

  • gdi句柄,设备上下文和绘图对象(如位图和画笔等)等。除了配额之外,它与user32处理的硬限制相同。

当程序占用三个配额限制中的一个时,程序将始终失败。但如果其他进程使用大量的user32或gdi对象或内核内存池受到压力,可能会提前失败。

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

但是,代替编写代码,最简单的方法是使用任务管理器,进程选项卡。使用视图+选择列,在Windows 8上,右键单击列标题,并勾选句柄,用户对象和GDI对象。在调试代码时,您可以在程序执行时立即获得三组句柄类型的句柄计数的实时更新。