找到最后释放内存的位置?

时间:2009-03-27 23:23:19

标签: c debugging memory profiler

非常一般: 有没有一种简单的方法可以告诉哪一行代码在发生访问冲突时最后释放了一块内存?

不太通用: 我对分析器的理解是它们覆盖了分配和释放过程。如果这是真的,它们是否会碰巧存储最后释放一段内存的代码行,以便以后因为访问冲突而崩溃时,你知道最后释放它的是什么?

具体细节: Windows,ANSI C,使用Visual Studio

3 个答案:

答案 0 :(得分:7)

是!

安装Windows Debugging Tools并使用Application Verifier

  1. 文件 - >添加应用程序,选择您的.exe
  2. 在“基本”下,选择“内存和堆”。
  3. 在ntsd(ntsd yourprogram.exe)下运行程序的调试版本。
  4. 重现错误。
  5. 现在,当您发生崩溃时,您将从AppVerifier获取调试器中的其他信息。使用!avrf(可能需要很长时间才能运行(分钟)),它会尝试尽可能多地提供有用的信息。

    你们都可以在内存地址上使用dps命令来获取所有存储的堆栈信息(分配,释放等)。

    您还可以在内存地址上使用!heap命令:

    0:004> !heap -p -a 0x0C46CFE0
    

    也将转储信息。

    进一步阅读:

答案 1 :(得分:0)

简答:不。

您需要的是调试malloc。我不再跟上Windows了,但有几个,包括this free one

更新

看起来Visual Studio C有内置版本。见here

  

当应用程序与a链接时   调试C运行时的版本   库,malloc解析为   _malloc_dbg。有关如何管理堆的更多信息   调试过程见CRT   调试堆。

...并在此处查看_malloc_dbg

答案 2 :(得分:-1)

不,除非您提供自己的分配器(例如通过重载新/删除)来存储此信息。

分析师所做的事情高度依赖于他们的分析。我不知道任何跟踪你正在寻找什么的探查器。

也许如果您提供了有关您情况的更多详细信息,那么人们可能会建议另一种方法来诊断您遇到的问题。