【问题标题】:Memory Leak Analysis内存泄漏分析
【发布时间】:2009-11-13 00:57:45
【问题描述】:
  1. 我的应用程序中存在内存泄漏。运行应用程序几天后,内存消耗猛增。我需要转储每个孤立块地址的调用堆栈信息。 WinDbg 怎么可能?

  2. 我尝试引用同事创建的文档,但我对如何指定符号路径和类似的东西感到困惑。它没有成功。在哪里可以获得分步文档。

【问题讨论】:

  • 您必须使用Windows 甚至更多WinDbg 吗?你能在 Linux 上运行并使用 valgrind 吗?还是 Visual Studio 并使用他们的工具?
  • 你可以尝试翻找blogs.msdn.com/tess,她通常专注于内存转储级别的调试。

标签: c++ memory-leaks


【解决方案1】:

您可以使用 umdh.exe 捕获和比较泄漏发生前后的进程快照。这最适用于调试二进制文件 - 它会为您提供在第一个和第二个快照之间分配的内存调用堆栈。

http://support.microsoft.com/kb/268343

【讨论】:

  • +1 UMDH 是追踪泄漏的绝佳工具。请务必拍摄几张快照并进行比较,以便查看增长情况。虽然不是必需的,但在本地拥有符号而不是使用符号服务器会很有帮助,因为本地 pdb 的加载速度会快得多。
  • 嗨! Microsoft 网站上似乎不再在线提供 UMDH。有没有更新的替代方案?我正在使用 VS2008。
  • UMDH 实用程序包含在以下 Microsoft 网站上的 Windows 产品调试工具中:microsoft.com/whdc/devtools/ddk/default.mspx
【解决方案2】:
  1. 请参阅此页面上的“谁调用 HeapAlloc”条目:http://www.windbg.info/doc/1-common-cmds.html

  2. 有关符号服务器的信息,请参见此页面:http://www.microsoft.com/whdc/DevTools/Debugging/debugstart.mspx

【讨论】:

    【解决方案3】:

    首先我必须说你必须是一个受虐狂才能使用 WinDbg!如果你用 C++ 编写代码,你就不是在开发驱动程序,即使在这种情况下也有更多体面的调试器。扔掉那些垃圾,真的!

    为了解决这个问题,我会首先使用静态代码检查器来分析代码。 PC-Lint 是一种便宜的。然后在动态代码检查器中运行应用程序(例如 Boundschecker 或 Purify)。

    只有在您找不到罪魁祸首代码的情况下,我才会从您所在的位置开始。如果您编写的应用程序必须运行好几天又好几天,那么投资这样一个工具真的是物有所值。它可以让您在开始长时间运行测试之前更快地验证(不是 100%)代码,以找出代码检查器在几分钟内会发现什么...

    使用 Boundchecker,您可以使用 Marks,它使用的功能与 Steve Townsend 所说的类似(或者可能完全相同?)。有了它,您将看到自上次标记以来所有内存块仍在内存中。这在大型应用程序中相当乏味,因为您最终会遇到一大堆内存块......但是如果您提出这个问题,那么您可能已经非常绝望以至于想尝试它;-)

    【讨论】:

      【解决方案4】:

      在昨天之前我从未使用过 Memory Validator (http://www.softwareverify.com/cpp/memory/index.html),但它确实帮助我今天找到了一些东西。

      【讨论】:

        【解决方案5】:

        对于泄漏,我一直在使用 Visual Leak Detector,虽然它只在调试模式下工作,但它是免费的,而且看起来相当可靠

        【讨论】:

          猜你喜欢
          • 2013-05-24
          • 2012-05-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-24
          相关资源
          最近更新 更多