2013-03-07 101 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對象。在調試代碼時,您可以在程序執行時立即獲得三組句柄類型的句柄計數的實時更新。