寻找内存最后一次释放的位置?

4

非常泛化: 当访问冲突发生时,有没有一种简单的方法可以告诉我们哪一行代码最后释放了一个内存块?

较少泛化: 我理解探查器是通过覆盖分配和释放过程来实现的。如果这是真的,它们是否可能存储最后释放内存部分的代码所在行,以便当它因为访问违规而崩溃时,你知道最后谁释放了它?

具体细节: 使用Visual Studio,Windows, ANSI C。

3个回答

7

是的!

安装Windows调试工具并使用应用程序验证器

  1. 文件 -> 添加应用程序,选择您的 .exe 文件
  2. 在基本选项中,选择内存和堆。
  3. 使用 ntsd(ntsd yourprogram.exe)运行程序的调试版本。
  4. 重现错误。

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

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

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

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

这将同时转储信息。

进一步阅读:


0

简短回答:不行。

你需要的是一个调试 malloc。我不再关注 Windows 了,但有几个可用的选项,包括 这个免费的

更新

看起来 Visual Studio C 有内置版本。请参见 这里

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

...并参见 _malloc_dbg


-1

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

性能分析工具所做的事情高度依赖于它们正在分析的内容。我不知道有任何性能分析工具可以跟踪您要查找的内容。

也许如果您提供更多关于您遇到问题的情况的细节,人们可以建议其他诊断问题的方法。


例如:在这种情况下,如果内存性能很重要,您的应用程序中已经有自定义/动态分配内存的功能。 - Andrew Grant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接