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

C++ 难以检测到未定义的行为(或错误),c++,debugging,undefined-behavior,cinder,C++,Debugging,Undefined Behavior,Cinder,我正在VisualStudio中做一个基本的cinder应用程序。这是一个粒子生成(大致遵循联机指南)。在调试模式下,它总是工作。但是在发布配置中,它有时不生成任何粒子 我最好的猜测是在某个地方有UB,问题是它真的很难被检测到。微小的、看似无关的变化可能会触发或消除这种情况 例如,更改函数绘图: spatial_.speed_ += 0.1f * ci::Vec2f(cos(noise * 15.0f), sin(noise * 15.0f)); // ^^^^^

我正在VisualStudio中做一个基本的cinder应用程序。这是一个粒子生成(大致遵循联机指南)。在调试模式下,它总是工作。但是在发布配置中,它有时不生成任何粒子

我最好的猜测是在某个地方有UB,问题是它真的很难被检测到。微小的、看似无关的变化可能会触发或消除这种情况

例如,更改函数
绘图

spatial_.speed_ += 0.1f * ci::Vec2f(cos(noise * 15.0f), sin(noise * 15.0f));
//                ^^^^^
//                this value
除1.0f以外的任何常量值或缺少常量值都不会导致生成粒子。函数
draw
中的更改如何影响函数
update
中的代码(我在其中生成粒子)。我知道它们根本不会生成,因为我显示了粒子计数

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

我不想你们调试我的代码,这就是为什么我没有把代码放在这里。
我只是不知道如何处理这个问题。我的问题是我应该如何继续诊断这个错误?我有什么选择,我必须从这里采取什么步骤

我面临的问题是:

  • 我不知道整个代码中的错误在哪里
  • 在调试模式下,一切正常
  • 我无法在发布模式下进行调试(
    找不到***.exe的调试信息,或者调试信息不匹配。二进制文件未使用调试信息生成)
    ),GUI中的任何断点都会在工具提示下变白。
    当前不会命中断点(此文档未加载任何符号)
  • 我无法通过打印输出进行调试,因为将代码添加到显示输出将使程序工作。(这有多讽刺?)
  • 在发布模式下,即使我让它工作(通过尝试和错误,添加/删除行),如果我没有发现问题,也没有什么可以说在其他地方更改某些内容会再次破坏代码
更新:

  • CppCheck报告没有问题。我已手动双重检查未初始化的成员/变量
  • 我一直在尝试隔离这件事。问题是,我所做的任何修改都会导致生成粒子。如果我更改
    draw
    函数中的任何代码,将生成粒子。如果我删除以编码粒子的大小,将生成粒子。如果我删除运动的代码,则粒子将生成es。如果我删除绘制粒子的代码,将生成粒子。如果我删除粒子初始位置的代码,将生成粒子,如果我删除移除死粒子的代码,将生成粒子。我发现它保持故障的唯一原因是如果我更改fps设置,所以是的,我知道设置fps不会导致问题,所以万岁

你考虑过单元测试吗?@KerrekSB我从来没有参与过单元测试(我是一名学生).这是怎么回事?第一步是将行为隔离成一个小的完整的program@bolov购买一本书或五本主题,学习一个测试框架或三,并开始写一些项目在一个测试驱动的方式。尝试静态C++代码分析器,如Cppcheck -它可以指向您可能的UB的原因,如使用未初始化变量,忽略f函数返回码等。