【发布时间】:2009-03-27 23:23:19
【问题描述】:
非常笼统: 当访问冲突发生时,是否有一种简单的方法可以判断哪一行代码最后释放了一块内存?
不太笼统: 我对分析器的理解是它们会覆盖分配和释放过程。如果这是真的,他们是否会碰巧存储最后释放一段内存的代码行,以便以后由于访问冲突而崩溃时,您知道最后释放的是什么吗?
具体说明: Windows,ANSI C,使用 Visual Studio
【问题讨论】:
标签: c debugging memory profiler
非常笼统: 当访问冲突发生时,是否有一种简单的方法可以判断哪一行代码最后释放了一块内存?
不太笼统: 我对分析器的理解是它们会覆盖分配和释放过程。如果这是真的,他们是否会碰巧存储最后释放一段内存的代码行,以便以后由于访问冲突而崩溃时,您知道最后释放的是什么吗?
具体说明: Windows,ANSI C,使用 Visual Studio
【问题讨论】:
标签: c debugging memory profiler
是的!
安装Windows Debugging Tools 并使用Application Verifier。
现在,当您发生崩溃时,您将在调试器中从 AppVerifier 获得更多信息。使用 !avrf (可能需要很长时间才能运行(分钟)),它会尝试为您提供尽可能多的有用信息。
你都可以在内存地址上使用dps命令来获取所有存储的堆栈信息(分配、释放等)。
你也可以对内存地址使用!heap命令:
0:004> !heap -p -a 0x0C46CFE0
这也会转储信息。
进一步阅读:
【讨论】:
简短回答:不。
您需要的是一个调试 malloc。我不再跟上 Windows,但有几个,包括 this free one。
看起来 Visual Studio C 有一个内置版本。见here
当应用程序与 C 运行时的调试版本 库,malloc 解析为
_malloc_dbg。有关如何管理堆的更多信息 调试过程,见 CRT 调试堆。
...看到这里_malloc_dbg。
【讨论】:
不,除非您提供自己的分配器(例如通过重载 new/delete)来存储此信息。
分析器所做的工作在很大程度上取决于他们正在分析的内容。我不知道有任何分析器可以跟踪您正在寻找的内容。
如果您提供了更多关于您的情况的详细信息,人们可能会建议一种替代方法来诊断您遇到的问题。
【讨论】: