是否有可以连接到现有应用程序的手柄泄漏检测器?

Fre*_*abe 6 c++ winapi memory-leaks

我参与了各种C++项目(主要是使用MSVC6到MSVC10),我们最近发现了一些句柄泄漏(CreateThread函数给出的线程句柄).我怀疑还有很多其他手柄被泄漏了,我想整合一个测试,验证我们的夜间测试结果没有泄漏手柄.

我的想法是开发一个DLL来检测相关的kernel32.dll函数(CreateThread,OpenProcess,CreateProcess和其他十几个)以及CloseHandle函数.然后,对于每个获取的句柄,DLL将记忆回溯.在该过程结束时,DLL将打印所有未关闭到某种日志文件的句柄回溯,然后可以由测试框架解析.

这当然也会产生所有仍然可以到达的句柄的回溯(所以从技术上讲,它们没有泄漏 - 也许作者希望操作系统在进程终止时回收它们)但我猜是明确地关闭它们并没有伤害 - 特别是因为我们已经为这些东西提供了一些不错的RAII包装器,所以我们不应该尽可能多地使用它.

现在我想知道 - 这似乎是一种相当简单的方法; 也许这里有人知道已经这样做的图书馆?

Col*_*nee 3

这绝对是可能的,但我认为还没有一个库可以做到这一点。

我认为最简单的方法是使用应用程序验证器。您可以从 Microsoft 的Windows 调试工具中获取它。将其配置为跟踪应用程序的句柄,在调试器中运行应用程序一段时间,然后当应用程序退出时将转储句柄列表。

另一种不使用应用程序调试器的方法是在应用程序退出之前设置断点或暂停。当应用程序暂停时,使用 Process Explorer 之类的工具来获取所有打开句柄的列表。

出于您的目的,我认为后者将是更好的选择。我不确定是否有任何使用调试输出的自动化工具。您可以使用 WDK 的某些功能来检索当前进程(或另一个进程)打开句柄的列表,但这有点复杂。