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(パーティクルを生成する場所) にどのように影響しますか。粒子数を表示しているので、まったく生成されていないことがわかります。

プログラム中のあらゆる種類の変更がこれを引き起こします (定数の変更、値から参照へのパラメーターの型の変更、console() に出力する行の追加または削除など)。

皆さんに私のコードをデバッグしてほしくないので、ここにコードを入れませんでした。
私はこれに対処する方法に迷っています。私の質問は、バグを診断するにはどうすればよいですか? ここからどのような手順を踏む必要がありますか?

私が直面している問題:

  • コード全体のどこにバグがあるのか​​ わかりません。
  • デバッグモードではすべて正常に動作します
  • リリース モード ( debugging information for ***.exe cannot be found or does not match. Binary was not build with debug information) でデバッグできず、ブレーク ポイントがツールチップと共に GUI で白く表示されます。the breakpoint will not be currently hit (no symbols have been loaded for this document)
  • 出力を表示するコードを追加するとプログラムが機能するため、出力を印刷してデバッグすることはできません。(これはどれほど皮肉なことですか?)
  • リリースモードでは、(試行錯誤、行の追加/削除によって) 動作するようになったとしても、問題を特定しなければ、別の場所で何かを変更するとコードが再び壊れることは言うまでもありません。

アップデート:

  • CppCheck は問題を報告しません。初期化されていないメンバー/変数を手動で再確認しました。
  • 私はこれを隔離しようとしてきました。問題は、私が行う変更によってパーティクルが生成されることです。関数内のコードを変更するdrawと、パーティクルが生成されます。粒子のサイズのコードを削除すると、粒子が生成されます。モーションのコードを削除すると、パーティクルが生成されます。パーティクルを描画するコードを削除すると、パーティクルが生成されます。パーティクルの初期位置のコードを削除すると、パーティクルが生成されます。死んだパーティクルを削除するコードを削除すると、パーティクルが生成されます。私が見つけた唯一のことは、fps設定を変更した場合です.fpsの設定が問題の原因ではないことがわかっているので、万歳.
4

0 に答える 0