非常一般:当发生访问冲突时,是否有一种简单的方法可以判断哪一行代码最后释放了内存块?
不太一般:我对探查器的理解是它们会覆盖分配和释放过程。如果这是真的,他们是否会碰巧存储最后释放一段内存的代码行,以便当它稍后因访问冲突而崩溃时,您知道最后释放它的是什么?
规格:Windows、ANSI C、使用 Visual Studio
Yes!
安装Windows 调试工具并使用应用验证器.
- 文件 -> 添加应用程序,选择您的 .exe
- 在“基础”下,选择“内存和堆”。
- 在 ntsd 下运行程序的调试版本 (ntsd yourprogram.exe)。
- 重现该错误。
现在,当您发生崩溃时,您将在调试器中从 AppVerifier 获得更多信息。使用!avrf(可能需要很长时间才能运行(分钟)),它会尝试为您提供尽可能多的有用信息。
您都可以在内存地址上使用 dps 命令来获取所有存储的堆栈信息(分配、释放等)。
您还可以对内存地址使用 !heap 命令:
0:004> !heap -p -a 0x0C46CFE0
这也会转储信息。
进一步阅读:
- 高级 Windows 调试,Hewardt 和 Pravat
- 使用 PageHeap 进行调试
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)