【问题标题】:Finding where memory was last freed?查找上次释放内存的位置?
【发布时间】:2009-03-27 23:23:19
【问题描述】:

非常笼统: 当访问冲突发生时,是否有一种简单的方法可以判断哪一行代码最后释放了一块内存?

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

具体说明: Windows,ANSI C,使用 Visual Studio

【问题讨论】:

    标签: c debugging memory profiler


    【解决方案1】:

    是的!

    安装Windows Debugging Tools 并使用Application Verifier

    1. 文件 -> 添加应用程序,选择您的 .exe
    2. 在 Basics 下,选择 Memory and Heaps。
    3. 在 ntsd (ntsd yourprogram.exe) 下运行程序的调试版本。
    4. 重现错误。

    现在,当您发生崩溃时,您将在调试器中从 AppVerifier 获得更多信息。使用 !avrf (可能需要很长时间才能运行(分钟)),它会尝试为您提供尽可能多的有用信息。

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

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

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

    这也会转储信息。

    进一步阅读:

    【讨论】:

      【解决方案2】:

      简短回答:不。

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

      更新

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

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

      ...看到这里_malloc_dbg

      【讨论】:

        【解决方案3】:

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

        分析器所做的工作在很大程度上取决于他们正在分析的内容。我不知道有任何分析器可以跟踪您正在寻找的内容。

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

        【讨论】:

        • 例如=示例。在这种情况下,在您的应用中使用 custom/malloc free,如果内存性能很重要,您已经拥有了。
        猜你喜欢
        • 2019-01-20
        • 2011-01-23
        • 1970-01-01
        • 1970-01-01
        • 2012-04-10
        • 2011-05-07
        • 2015-10-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多