【问题标题】:Tool for detecting memory leaks [closed]用于检测内存泄漏的工具 [关闭]
【发布时间】:2011-02-20 19:09:58
【问题描述】:

purify 和 valgrind 等内存泄漏检测工具如何工作?

我如何设计和实现自己的此类工具?

【问题讨论】:

标签: c++ c unix memory-management memory-leaks


【解决方案1】:

这样的工具通常工具带有自己的代码的可执行文件。例如,他们用自己的函数替换对malloc()free() 的每次调用,从而允许他们跟踪每次分配。

在 Visual Studio 中,这可以使用 _CrtDumpMemoryLeaks() 系列中的函数仅使用 C 运行时库自动完成

【讨论】:

  • 您可以使用工具 - deleaker(如果您是 Windows 用户)。
  • deleaker - 很酷的工具!支持内存和 GDI 泄漏等
【解决方案2】:

对于基本的泄漏检测,您只需要挂钩到低级内存分配例程,例如通过修补 malloc/free。然后,您跟踪所有分配并随后在适当的时间报告任何尚未释放的,例如就在退出之前。

【讨论】:

    【解决方案3】:

    对于实际工作,valgrind 工作得很好。它检测无效的读/写和内存泄漏。

    对于爱好项目,您可以创建自己的内存管理模块来跟踪各种指针分配及其使用情况。如果您长时间没有看到某个内存位置被使用,则可能是泄漏。

    【讨论】:

      【解决方案4】:

      您可以查找一些内存管理/分析工具的 BSD 实现以获取代码示例。比如http://code.google.com/p/google-perftools/wiki/GooglePerformanceTools

      【讨论】:

        【解决方案5】:

        我正在开发这个工具:Deleaker

        当然,显而易见的想法是挂钩所有执行分配和释放的函数。这不仅是 malloc 和 free,而是 HeapAlloc / HeapFree(如果我们谈论的是 Windows 平台),因为现代 VC++ 版本(VC 6.0 之后)只是将 malloc / free 重定向到 winapi 的 HeapAlloc / HeapFree。

        对于每个分配,都会保存一个堆栈并保存一个对象。在每次释放时,对象都会被释放。乍一看,它是如此简单:只需存储已分配对象的列表并在释放钩子上删除一个对象。

        但有一些棘手的部分:

        • 速度

        您需要维护已分配对象的列表。如果您在每个挂钩函数中添加/删除一个对象,则该进程正在执行太慢。这似乎是此类工具的常见问题。

        • 堆栈跟踪

        使用 dbghelp.dll 函数获取堆栈跟踪需要大量时间。您必须更快地获取堆栈条目:例如通过手动读取进程内存。

        • 误报

        一些泄漏是由系统 DLL 产生的。如果你把它们全部展示出来,你就会有大量的漏洞,但用户无法“解决”它:他/她无权访问其源代码,也无法阻止执行此代码。阻止这种泄漏是不可能的。其中一些是系统 dll 入口点的单一分配,因此它不是真正的泄漏(一个好问题,到底是什么泄漏?)。如何识别那些必须显示的泄漏?一个好的过滤就是一个答案。

        希望这会有所帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-06-06
          • 1970-01-01
          • 1970-01-01
          • 2011-09-17
          • 1970-01-01
          • 2016-05-14
          • 2010-09-29
          • 2012-08-15
          相关资源
          最近更新 更多