有什麼方法可以在程序終止時檢測文件句柄泄漏嗎?用Win32 C++檢測文件句柄泄漏
特別是我想確保所有創建的句柄都在代碼中被釋放。
例如,我可能有一個的CreateFile()的地方,並且在程序終止我想檢測,確保所有的人都被關閉。
有什麼方法可以在程序終止時檢測文件句柄泄漏嗎?用Win32 C++檢測文件句柄泄漏
特別是我想確保所有創建的句柄都在代碼中被釋放。
例如,我可能有一個的CreateFile()的地方,並且在程序終止我想檢測,確保所有的人都被關閉。
我用!的WinDbg HTRACE命令便宜。
!htrace -enable
!htrace -snapshot
!htrace -diff
允許您比較兩個執行點的句柄情況,並幫助您找到泄漏句柄已分配的位置。
它對我很好。
BoundsChecker或其他類似的程序將做到這一點。我還認爲在VC6及以上版本的調試器下運行會報告泄漏列表。也許這是因爲我總是有插件工具來做這種事情。
你也可以使用MS的Application Verifier。
對文件句柄和類似資源使用智能指針。
如果你可以(即,如果它不是一個巨大的遺留代碼庫,你正在修復),你應該考慮使用RAII習語來環繞你的文件句柄。 通過在構造函數中「取」文件句柄並在析構函數中釋放文件句柄,您可以確定,當RAII超出範圍時,文件句柄也會被很好地清理。
這是相同的原則,智能指針,這是一個非常有用的概念在你的工具箱有避免在C++這樣的問題。
另一個末端將是的Sysinternals的FileMon(Link)。
它顯示了文件系統的活動性,所以它應該支持你找到打開的句柄。
如果您不能負擔的BoundsChecker或類似的...
一招我用是更換CreateFile
等用我自己的包裝。除了返回句柄值之外,他們還記錄了__FILE__和__LINE__與每個句柄一起去。您還需要包裝CloseHandle
,以確保正確關閉的手柄不會產生誤報。
很簡單:
// StdAfx.h
#include <windows.h>
#undef CreateFile
#if defined(UNICODE)
#define CreateFile DbgCreateFileW
#else
#define CreateFile DbgCreateFileA
#endif
// etc.
然後你在代碼中定義DbgCreateFileW
和DbgCreateFileA
地方。
這假設你已經控制了相關的代碼段。如果不是的話,你可以使用(例如)Microsoft Detours來做類似的事情(你需要一個許可證才能將它包含在已發佈的產品中,但我相信它可以免費用於調試/測試/等等。)
但長期來看,您應該考慮將代碼轉換爲使用「智能」手柄類型,該類型在超出範圍時自動調用CloseHandle
。
正如MadKeithV所述,您可以使用RAII來產生很好的效果。
另外一個簡單的方法(和自由)是使用Visual Leak Detector。這不是完美的,但確保你有free'd/delete [] d/close'd等好方法。
我建議這個工具Memory Validator
這是非常好的。
windbg或ntsd有一個!句柄擴展,告訴你應用程序已經打開了什麼。我想你可以在程序的最後放置一個斷點並在那裏放置句柄。
在powerdbg(http://www.codeplex.com/powerdbg)中可能還會做某些事情來自動執行此過程。
當然,這裏假設你的時間比買一個解決方案:)
簡要閱讀文檔並未發現有關手柄泄漏檢測的任何內容。我錯過了什麼? – 2009-01-14 11:51:00
訣竅是,代碼必須在一個DLL中,當它卸載泄漏檢測將拿起泄漏的句柄和泄漏的堆分配 – paulm 2014-05-29 22:41:59