c++ - 是否有可以链接到现有应用程序的 handle 检漏仪?

标签 c++ winapi memory-leaks

我参与了各种 C++ 项目(主要使用 MSVC6 到 MSVC10),我们最近在这些项目中发现了一些句柄泄漏(由 CreateThread 函数给出的线程句柄)。我怀疑还有很多其他句柄也泄漏了,我想集成一个测试来验证没有句柄泄漏到我们的夜间测试结果中。

我的想法是开发一个 DLL,它检测相关的 kernel32.dll 函数(CreateThread、OpenProcess、CreateProcess 等等)以及 CloseHandle功能。然后,DLL 将为获取的每个句柄记住一个回溯。在该过程结束时,DLL 会将所有未关闭的句柄回溯打印到某种日志文件中,然后测试框架可以对其进行解析。

这当然也会为所有仍可访问的句柄产生回溯(所以从技术上讲,它们没有泄漏 - 也许作者打算在进程终止时操作系统回收它们)但我猜明确地关闭它们不会伤害 - 特别是因为我们已经有了一些不错的 RAII这些东西的包装器,我们只是没有像我们应该的那样使用它。

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

最佳答案

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

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

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

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

关于c++ - 是否有可以链接到现有应用程序的 handle 检漏仪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8223733/

相关文章:

c++ - 从右到左的阅读顺序 : why isn't this calculated automatically?

c++ - C 函数调用产生与 C++ 函数调用不同的结果

c++ - `const` 关键字在函数之后有什么作用?

Java Try-with-resource 在 Map 中存储输入流

node.js - 我有内存泄漏吗? ( Node )

c++ - Visual Studio C++ Express 2010 - 它是否适用于非托管代码?

C++,将字符串中的文件名传递给类函数,将其用于ifstream对象

c++ - DirectX 小应用程序像 hell 一样消耗资源

c - (C) 不兼容的指针类型 [LPCWSTR]

ios - 内存管理 : does this code has a memory leak?