如何在Windows上诊断堆损坏错误?

时间:2015-05-23 13:09:59

标签: c++ linux windows opengl visual-studio-2013

我在Visual Studio 2013 Ultimate中使用Windows 8.1 64位。我正在将程序从Linux移植到Windows,它使用C ++,OpenGL和SDL。我在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还是我应该只使用我的胆量?

2 个答案:

答案 0 :(得分:9)

使用调试堆并在main()的最开头调用它。

_CrtSetDbgFlag(_CRTDBG_CHECK_ALWAYS_DF);

它会大大减慢程序的速度,但一旦发生损坏就会中断。

有关详细信息,请参阅此文章:https://msdn.microsoft.com/en-us/library/974tc9t1.aspx#BKMK_Check_for_heap_integrity_and_memory_leaks

答案 1 :(得分:5)

@ Carlos的解决方案非常适合较小的问题。但是对于巨大的问题,由此产生的减速有时是你无法忍受的。

在这种情况下,可以放置

ASSERT(_CrtCheckMemory()); 

代码中的某个地方,人们怀疑问题已经存在。此命令检查堆中的堆(并且仅在其处),而不是在new delete的每个_CRTDBG_CHECK_ALWAYS_DF_CRTDBG_CHECK_ALWAYS_DF调用之后。与选项cardBackgroundColor相比,这可以使执行时间合理。

通过使用二进制搜索方法放置断言,可以很快找到有问题的代码行。