2008-11-24 33 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)中可能还会做某些事情来自动执行此过程。

当然,这里假设你的时间比买一个解决方案:)