内存泄漏分析

时间:2009-11-13 00:57:45

标签: c++ memory-leaks

  1. 我的应用程序中存在内存泄漏。运行应用程序几天后,内存消耗量就会增加。我需要转储每个孤立块地址的调用堆栈信息。如何使用WinDbg?

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

5 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

  1. 请参阅此页面上的“Who called HeapAlloc”条目:http://www.windbg.info/doc/1-common-cmds.html

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

答案 2 :(得分:0)

首先,我必须说你必须是使用WinDbg的受虐狂!如果使用C ++编写代码,则不会开发驱动程序,即使在这种情况下也有更好的调试器。扔掉那个废话,真的!

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

只有当你找不到罪魁祸首时,我才能从你所处的位置开始。如果您编写的应用程序必须运行数天和数天,那么投资这样的工具确实物有所值。它使您能够在开始长时间运行的测试之前更快地验证(而不是100%)代码,以找出代码检查器在几分钟内找到的内容......

使用Boundchecker你可以使用Marks,它使用的是与Steve Townsend所说的相似的功能(或者可能完全相同?)。有了它,你会看到自上一个Mark以来所有内存块仍然挂在内存中。这在大型应用程序中相当繁琐,因为你最终会得到大量的内存块....但如果你提出这个问题,那么你可能已经非常绝望,你想尝试它; - )

答案 3 :(得分:0)

我昨天之前从未使用过记忆验证器(http://www.softwareverify.com/cpp/memory/index.html),但它确实帮助我今天跟踪了一些事情。

答案 4 :(得分:0)

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