我的应用程序使用GLUTesselator来检查复杂的凹多边形。它在我运行普通版本exe时随机崩溃,但如果我在VS中开始调试它永远不会崩溃。我在这里找到了这个基本上是我的问题:
The multi-thread debug CRT (/MTd) masks the problem, because, like
Windows对生成的进程执行操作 一个调试器,它提供给你的 编程调试堆,即 初始化为0xCD模式。 可能在某处您使用了一些 未初始化的记忆区域 堆作为指针,你解除引用 它;你得到两个调试堆 出于某种原因离开它(也许吧 因为在地址0xbaadf00d和 0xcdcdcdcd有效分配 内存),但与“正常”堆 (通常初始化为0)你 获得访问冲突,因为你 取消引用NULL指针。
问题是在GLU32.dll中发生崩溃,我无法找出为什么它有时试图取消引用空指针。当我的多边形变得相当大并且有很多点时,它似乎会这样做。我该怎么办?
由于
答案 0 :(得分:3)
生活中的一个事实是,有时程序在调试器中的行为有所不同。在你的情况下,一些内存的初始化方式不同,它的布局也可能不同。并发程序中的另一个常见情况是时序不同,并且在调试器中经常发生竞争条件。
您可以尝试手动将堆初始化为其他值(或查看Visual Studio中是否有此选项)。通常初始化为非零会捕获更多错误,但在您的情况下可能不是这种情况。您还可以尝试使用程序的内存映射来安排页面0xcdcdc000未映射。
Visual Studio可以在访问特定内存地址时设置断点,您可以尝试这一点(它可能会使程序的速度明显慢于变量断点)。
答案 1 :(得分:2)
但如果我在VS中开始调试,它永远不会崩溃。
好吧,我不确定为什么,但是在Visual Studio程序中调试有时可以通过访问某些内存区域而无需调试器就会崩溃。我不知道确切的原因,但有时0xcdcdcdcd和0xbaadfood与此无关。它只是访问某些地址不会导致问题。当发生这种情况时,您需要找到猜测问题的替代方法。
我该怎么办?
可能的解决方案:
configuration properties->c/c++->code genration
)中打开/关闭“基本运行时检查”和“缓冲区安全检查”。 答案 2 :(得分:2)
指向早期问题和两个想法的链接。
首先,您可能希望查看以前question关于Windows的valgrind替代品。有很多关于可以帮助你的程序的好提示。
现在的想法:
1)调试器可能会阻止您的程序在您正在测试的代码中崩溃,但它并没有解决问题。在最糟糕的情况下,你只是在街上踢罐头,但仍然存在腐败现象,但从你的运行方式来看并不明显。当您发货时,您可以放心,有人会再次遇到问题。
2)在这种情况下经常发生的事情是错误不在问题发生的地方附近。虽然您可能会注意到GLU32.dll中的问题,但可能更早出现了损坏,甚至可能在不同的线程或函数中,这不会导致问题,并且在稍后的某个时刻程序回到损坏的区域并失败。