我正在使用Windows 8.1 64位和Visual Studio 2013旗舰版。我正在将一个程序从Linux移植到Windows,该程序使用C++、OpenGL和SDL。我在Windows 64位上通过cmake自定义编译了相应的库。当我从Visual Studio运行该程序时,IDE显示有头损坏。这并不奇怪,因为我使用指针来示例化对象。我使用的是原始指针,为了便于讨论,我打算把它改成智能指针,稍后我会做一些增强的操作。
与此同时,我用我的Linux电脑诊断了Valgrind的内存泄漏,没有任何严重的报告。然后我继续使用CppCheck,但也没有任何严重的报告。也许我在这里太宽容了,Windows可能实际上比Linux更严重地对待不太严重的问题,这是一个惊喜,因为MSVC往往比GCC更宽容。
所以,这个程序可以在Linux上运行,而不能在Windows上运行。(太棒了!)Visual Studio到处抛出异常也没有帮助,这让我更加讨厌Windows。我开始在谷歌上搜索解决方案,发现了一个叫做gflags或页面助手的东西,所以我安装了调试工具,并试图启动gflags,但我不知道如何使用它!后来我发现必须使用其他一些称为adp的工具,然后将gflags附加到它,所以当我启动adp时它崩溃了。所以现在我不知道该怎么做,并且处于中止端口的边缘(这很有趣,因为许多人都在抱怨将程序从Windows移植到Linux有多难,而事实恰恰相反)。
所以,现在我呼吁社会各界给予帮助:我如何调试/诊断发生在Windows上而不是Linux上的堆损坏错误?2我真的应该使用gflags还是应该使用我的直觉?
2条答案
按热度按时间whitzsjs1#
使用调试堆,并在main()中的最开始调用它。
_CrtSetDbgFlag(_CRTDBG_CHECK_ALWAYS_DF);
它会大大降低程序的速度,但一旦发生损坏,它应该会崩溃。
有关详细信息,请参阅以下文章:https://msdn.microsoft.com/en-us/library/974tc9t1.aspx#BKMK_Check_for_heap_integrity_and_memory_leaks
50few1ms2#
@卡洛斯的解决方案对于小问题来说是完美的,但对于大问题,由此导致的慢下来有时是你无法忍受的。
在这种情况下,可以放置
在代码中的某个地方,人们怀疑问题已经存在了。这个命令在(并且只在)插入堆的位置检查堆,而不是像
_CRTDBG_CHECK_ALWAYS_DF
那样在每次new
或delete
调用之后检查堆。与_CRTDBG_CHECK_ALWAYS_DF
选项相比,这样可以保持合理的执行时间。通过使用二分搜索的方法放置Assert,可以很快找到有问题的代码行。
但是,有时
_CrtSetDbgFlag(_CRTDBG_CHECK_ALWAYS_DF)
和/或_CrtCheckMemory()
无法检测问题。Then usinggflags
is another possibility,它可以显示堆损坏发生的位置。将显示一个报告,说明
exe_to_debug.exe
的堆检查已激活。可以列出激活堆检查的程序