4

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

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

规格: Windows、ANSI C、使用 Visual Studio

4

3 回答 3

7

是的!

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

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

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

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

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

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

这也将转储信息。

延伸阅读:

于 2009-03-27T23:34:32.500 回答
0

简短的回答:没有。

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

更新

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

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

...并在此处查看_malloc_dbg

于 2009-03-27T23:32:57.403 回答
-1

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

分析器所做的工作高度依赖于他们正在分析的内容。我不知道有任何分析器可以跟踪您正在寻找的内容。

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

于 2009-03-27T23:28:39.893 回答