如何诊断Windows上的堆损坏错误?
我在Visual Studio 2013 Ultimate中使用Windows 8.1 64位。 我正在将一个程序从Linux移植到使用C ++,OpenGL和SDL的Windows。 我在Windows上通过64位cmake自定义编译的库。 当我从Visual Studio运行程序时,IDE说有一个头部损坏。 这并不奇怪,因为我使用指针来实例化对象,并且我使用了原始指针,为了争论,我打算将其改为智能指针。 我会在稍后做推动魔术。
与此同时,我用我的Linux计算机通过Valgrind诊断任何内存泄漏,Valgrind没有任何严重的报告。 然后我开始使用CppCheck,但是那里也没有严重的问题。 也许我在这里过于宽松,Windows可能会采取比Linux更严重的不严肃的事情,这是一个惊喜,因为MSVC比GCC更容易宽容。
因此,该程序在Linux上运行,而不在Windows上运行。 (太棒了!)而Visual Studio并没有帮助我们抛弃异常情况,这让我更讨厌Windows。 我开始搜索一个解决方案,并遇到这个叫做gflags或页面助手的东西,所以我安装了调试工具并尝试启动gflags,但我不知道如何使用它! 后来我发现你必须使用其他一些名为adp的工具,然后附加gflags,所以当我启动adp时它会崩溃。 所以现在我不知道应该做什么,并且正在放弃端口(这很有趣,因为很多人都在抱怨将程序从Windows移植到Linux是多么的困难,而事实恰恰相反)。
所以,现在我呼吁这个社区寻求帮助:我如何调试/诊断在Windows上发生的堆损坏错误,而不是在Linux上? 我真的应该使用gflags吗,还是应该用我的胆量呢?
使用调试堆并在main()的最开始调用它。
_CrtSetDbgFlag(_CRTDBG_CHECK_ALWAYS_DF);
它会减慢程序的速度,但一旦发生腐败,它应该会中断。
有关详细信息,请参阅此文章:https://msdn.microsoft.com/en-us/library/974tc9t1.aspx#BKMK_Check_for_heap_integrity_and_memory_leaks
@ Carlos的解决方案适用于较小的问题。 但对于巨大的问题,由此产生的减速有时候是不能忍受的。
在这种情况下,可以放置
ASSERT(_CrtCheckMemory());
在代码的某处,人们怀疑问题已经存在。 该命令在(并且仅在)它所插入的位置处检查堆,而不是在每次new
或delete
调用之后检查堆,如_CRTDBG_CHECK_ALWAYS_DF
的情况。 与_CRTDBG_CHECK_ALWAYS_DF
选项相比,这保持了合理的执行时间。
通过使用二进制搜索类型的方法来放置断言,人们可以非常快速地找到有问题的代码行。
链接地址: http://www.djcxy.com/p/82343.html上一篇: How do I diagnose heap corruption errors on Windows?
下一篇: GFlags setting to catch heap corruption (other than Page Heap)?