非常一般: 有没有一种简单的方法可以判断发生访问冲突时哪一行代码最后释放了一 block 内存?
不太一般: 我对分析器的理解是它们覆盖了分配和释放过程。如果这是真的,他们是否会恰好存储最后释放一段内存的代码行,以便当它后来因访问冲突而崩溃时,您知道最后释放它的是什么?
细节: Windows,ANSI C,使用 Visual Studio
最佳答案
是的!
安装 Windows Debugging Tools并使用 Application Verifier .
- 文件 -> 添加应用程序,选择您的 .exe
- 在基础知识下,选择内存和堆。
- 在 ntsd (ntsd yourprogram.exe) 下运行程序的调试版本。
- 重现错误。
现在当您使崩溃发生时,您将在调试器中从 AppVerifier 获得更多信息。使用 !avrf(可能需要很长时间才能运行(分钟)),它会尽力为您提供尽可能多的有用信息。
您都可以在内存地址上使用 dps 命令来获取所有存储的堆栈信息(分配、释放等)。
您还可以在内存地址上使用 !heap 命令:
0:004> !heap -p -a 0x0C46CFE0
这也会转储信息。
进一步阅读:
关于c - 查找上次释放内存的位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/691794/