我正在 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 information
(the breakpoint will not be currently hit (no symbols have been loaded for this document)
- 我无法通过打印输出进行调试,因为添加代码以显示输出将使程序工作。(这有多讽刺?)
- 在发布模式下,即使我让它工作(通过试验和错误,添加/删除行),如果我没有发现问题,没有什么可以说改变其他地方的东西会再次破坏代码。
更新:
- CppCheck 报告没有问题。我已经手动仔细检查了未初始化的成员/变量。
- 我一直试图隔离这件事。问题是我所做的任何修改都会导致生成粒子。如果我更改
draw
函数中的任何代码,就会生成粒子。如果我删除粒子大小的代码,则会生成粒子。如果我删除运动的代码,就会生成粒子。如果我删除绘制粒子的代码,就会生成粒子。如果我删除粒子初始位置的代码,就会生成粒子,如果我删除删除死粒子的代码,就会生成粒子。我发现它保持故障的唯一一件事是如果我更改 fps 设置,所以是的,我知道设置 fps 不会导致问题,所以万岁。