寻找上次释放内存的位置?

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

不那么一般:我对分析器的理解是它们会覆盖分配和释放过程。 如果这是真的,他们可能会碰巧存储最后释放一段内存的代码行,以便当它由于访问冲突而崩溃时,您知道最后释放了哪些内容?

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


是!

安装Windows调试工具并使用Application Verifier。

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

    你可以全部使用内存地址上的dps命令来获取所有存储的堆栈信息(分配,取消分配等)。

    你也可以在内存地址上使用!heap命令:

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

    这也将转储信息。

    进一步阅读:

  • 高级Windows调试,Hewardt和Pravat
  • 使用PageHeap进行调试

  • 简答:不。

    你需要的是一个调试malloc。 我不再跟Windows了,但有几个关于,包括这个免费的。

    更新

    看起来像Visual Studio C有一个内置版本。 看这里

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

    ...并在这里查看_malloc_dbg。


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

    分析员所做的高度依赖于他们分析的内容。 我不知道有任何跟踪您要查找内容的分析器。

    也许如果你提供了关于你的情况的更多细节,人们可能会提出一种诊断你遇到的问题的替代方法。

    链接地址: http://www.djcxy.com/p/82287.html

    上一篇: Finding where memory was last freed?

    下一篇: Why does my STL code run so slowly when I have the debugger/IDE attached?