难以检测未定义的行为(或错误)

时间:2014-07-02 13:47:34

标签: c++ debugging undefined-behavior cinder

我正在Visual Studio中执行基本的cinder应用程序。这是一个粒子生成(松散地遵循在线Hello Cinder指南。在调试模式下它始终有效。但在发布配置中,它有时不会生成任何粒子。

我最好的猜测是某处有UB,问题是它很难被发现。小的,看似无关的变化可以触发或触发这一点。

例如,更改功能draw

spatial_.speed_ += 0.1f * ci::Vec2f(cos(noise * 15.0f), sin(noise * 15.0f));
//                ^^^^^
//                this value

除1.0f以外的任何常数值或没有常数值都不会产生任何粒子。函数draw中的更改如何影响函数update中的代码(我生成粒子的位置)。我知道它们根本没有生成,因为我显示了粒子数。

整个程序中的所有这些类型的更改都会导致这种情况(比如更改常量,将参数类型从值更改为引用,添加或删除输出到console()的行)。

我不希望你们调试我的代码,这就是我没有把代码放在这里的原因 我只是迷失在如何处理这个问题上。我的问题是我该如何进行诊断?我有什么选择,我必须从这里采取什么步骤?

我面临的问题:

  • 我不知道整个代码中的bug在哪里。
  • 在调试模式下,一切正常
  • 我无法在发布模式(debugging information for ***.exe cannot be found or does not match. Binary was not build with debug information)中进行调试,并且使用工具提示the breakpoint will not be currently hit (no symbols have been loaded for this document)
  • 在GUI中输出任何断点
  • 我无法通过打印输出 debug ,因为将代码添加到显示输出将使程序正常工作。 (讽刺这是怎么回事?)
  • 在发布模式下,即使我让它工作(通过反复试验,添加/删除行),如果我没有发现问题,没有什么可以说改变其他地方的东西会再次破坏代码。

更新

  • CppCheck报告没有问题。我手动双重检查未初始化的成员/变量。
  • 我一直试图孤立这件事。问题是我做的任何修改都会导致生成粒子。如果我更改draw函数中的任何代码,将生成粒子。如果我删除代码中的粒子大小,将生成粒子。如果删除运动代码,将生成粒子。如果我删除用于绘制粒子的代码,则将生成粒子。如果我删除粒子初始位置的代码,将生成粒子,如果我删除了去除死粒子的代码,粒子就会生成。我发现它唯一保留的错误是如果我更改了fps设置,所以是的,我知道设置fps不会导致问题,所以欢呼。

0 个答案:

没有答案