0

我正在 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(我生成粒子的地方)。我知道它们根本没有生成,因为我显示了粒子计数。

整个程序中的各种此类更改都会导致这种情况(例如更改常量,将参数类型从值更改为引用,添加或删除输出到控制台()的行)。

我不想让你们调试我的代码,所以我没有把代码放在这里。
我只是迷失了如何处理这个问题。我的问题是我应该如何继续诊断错误?我有哪些选择,我必须从这里采取哪些步骤?

我面临的问题:

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

更新:

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

0 回答 0