3

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

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

4

1 回答 1

7

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

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

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

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

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

明智的做法是不记录仍然可用的句柄数量,您无法找出,而是记录您已经消耗了多少句柄。您可以调用 GetGuiResources() 来跟踪使用的 user32 和 gdi 句柄的数量。GetProcessHandleCount() 返回您的进程正在使用的内核句柄数。

但是,到目前为止,最简单的方法是使用任务管理器的进程选项卡,而不是编写代码。使用查看 + 选择列,在 Windows 8 上右键单击列标题,然后勾选句柄、用户对象和 GDI 对象。您将在程序执行时获得三组句柄类型的句柄计数的实时更新,并在调试代码时获得即时反馈。

于 2013-03-07T13:16:01.623 回答