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