2008-11-24 58 views
8

有什麼方法可以在程序終止時檢測文件句柄泄漏嗎?用Win32 C++檢測文件句柄泄漏

特別是我想確保所有創建的句柄都在代碼中被釋放。

例如,我可能有一個的CreateFile()的地方,並且在程序終止我想檢測,確保所有的人都被關閉。

回答

5

我用!的WinDbg HTRACE命令便宜。

!htrace -enable 
!htrace -snapshot 
!htrace -diff 

允許您比較兩個執行點的句柄情況,並幫助您找到泄漏句柄已分配的位置。

它對我很好。

1

BoundsChecker或其他類似的程序將做到這一點。我還認爲在VC6及以上版本的調試器下運行會報告泄漏列表。也許這是因爲我總是有插件工具來做這種事情。

4

你也可以使用MS的Application Verifier

+0

簡要閱讀文檔並未發現有關手柄泄漏檢測的任何內容。我錯過了什麼? – 2009-01-14 11:51:00

+0

訣竅是,代碼必須在一個DLL中,當它卸載泄漏檢測將拿起泄漏的句柄和泄漏的堆分配 – paulm 2014-05-29 22:41:59

1

對文件句柄和類似資源使用智能指針。

7

如果你可以(即,如果它不是一個巨大的遺留代碼庫,你正在修復),你應該考慮使用RAII習語來環繞你的文件句柄。 通過在構造函數中「取」文件句柄並在析構函數中釋放文件句柄,您可以確定,當RAII超出範圍時,文件句柄也會被很好地清理。

這是相同的原則,智能指針,這是一個非常有用的概念在你的工具箱有避免在C++這樣的問題。

1

另一個末端將是的Sysinternals的FileMon(Link)。

它顯示了文件系統的活動性,所以它應該支持你找到打開的句柄。

4

如果您不能負擔的BoundsChecker或類似的...

一招我用是更換CreateFile等用我自己的包裝。除了返回句柄值之外,他們還記錄了__FILE__和__LINE__與每個句柄一起去。您還需要包裝CloseHandle,以確保正確關閉的手柄不會產生誤報。

很簡單:

// StdAfx.h 
#include <windows.h> 
#undef CreateFile 
#if defined(UNICODE) 
#define CreateFile DbgCreateFileW 
#else 
#define CreateFile DbgCreateFileA 
#endif 

// etc. 

然後你在代碼中定義DbgCreateFileWDbgCreateFileA地方。

這假設你已經控制了相關的代碼段。如果不是的話,你可以使用(例如)Microsoft Detours來做類似的事情(你需要一個許可證才能將它包含在已發佈的產品中,但我相信它可以免費用於調試/測試/等等。)

但長期來看,您應該考慮將代碼轉換爲使用「智能」手柄類型,該類型在超出範圍時自動調用CloseHandle

0

正如MadKeithV所述,您可以使用RAII來產生很好的效果。

另外一個簡單的方法(和自由)是使用Visual Leak Detector。這不是完美的,但確保你有free'd/delete [] d/close'd等好方法。

0

windbg或ntsd有一個!句柄擴展,告訴你應用程序已經打開了什麼。我想你可以在程序的最後放置一個斷點並在那裏放置句柄。

在powerdbg(http://www.codeplex.com/powerdbg)中可能還會做某些事情來自動執行此過程。

當然,這裏假設你的時間比買一個解決方案:)