Visual Studioから直接実行すると、実行可能ファイルが繰り返し出力可能な問題をデバッグしようとしていますが、ではありません。は、コマンドプロンプトから実行されたときこれはシングルスレッドのアプリケーションなので、タイミングに関して奇妙な動作があってはいけません。Visual Studioデバッガと実行可能ファイルをデバッガなしで実行する場合の違い
誰かが2つの環境の間にどのような違いがあるのかを列挙できますか?
私は実際の実行可能ファイルは同じであると確信しています - 両方ともリリースビルドで、同じ.exeファイルを実行しています。ここで
は、環境と結果は以下のとおりです。
- コマンドプロンプト(CMD)から直接実行:デバッグ(F5)を使用してVisual Studioから非反復性出力
- ラン:反復出力
- ランVisual Studioからデバッグなし(Ctrl-F5):非反復出力
作業ディレクトリが異なる可能性がありますが、作業ディレクトリでは同じです。
これらの結果に基づいて、「デバッグを使用して」(リリースビルドでも)実行されているように見えますが、何らかの形で問題が修正されています。これは可能性のある犯人を指していますか?実行可能ファイルをデバッグで実行する場合と実行しない場合の違いは何ですか?
解決策:受け入れられた回答で指摘したように、デバッグヒープが問題でした。問題はコードの深いところにあり、誰かが初期化される前に大きな配列の一部にアクセスしていたということでした。彼らはmallocでメモリを割り当てていて、メモリを0に初期化していませんでした。デバッグヒープは配列をいくらかの反復可能な値で埋めていましたが、デバッガが接続されていないとき(つまりコマンドラインからCtrl + F5)、値がランダムになり、プログラムの動作に小さな偏差が生じることがありました。残念ながら調整はほとんど目立たない程度に微妙で、問題のメモリはが処理の最初の「フレーム」の後で正しくリセットされましたが、初期条件はすでにわずかに異なり、損傷が行われていました。アクションのカオス理論!ガイダンスをありがとう。
偉大なデバッグのヒント:メモリを完全にランダムなデータで即座に埋め込むカスタムmallocを作成しました。そうすれば、使用する前に自分自身を適切に初期化していることを確認することができます。そうしないと、デバッグヒープを使用してデバッグモードでも結果がうまくいきません。
コードによって異なります。より高い最適化レベルでのみ動作する未定義の動作を引き起こしている可能性があります。 –
しかし理論的には、デバッガが接続されていないという唯一の違いはありませんか?ビルドは同じです - 両方のビルドをリリースします。最適化の程度は変わりません。 – aardvarkk
私はあなたが作業ディレクトリを調整していると言いますが、それはおそらく原因と思われます。私が探している他の問題は、インストールされたライブラリです。 VSは依存関係を処理します(また、ClickOnceを使用してビルドしてインストールする場合、依存関係を処理します)。ただし、コマンドラインで直接実行することはできません。 –