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の設定が問題の原因ではないことがわかっているので、万歳.