2

Visual Studio2008のC++に、fopenとfcloseだけでファイルを処理するコードがあります。デバッグモードではすべてが完璧に機能します。そして私はいくつかのデータセットでテストしました。ただし、リリースモードでは機能しません。いつもクラッシュします。私はすべての最適化をオフにしました。また、(リンカー内の)何にも依存していません。また、これらを設定しました。

最適化:無効(/ Od)参照されていないデータを保持します。Windows98用の冗長オプティマイズを削除しないでください:いいえ

私はまだそれがこれらの状況の下でどのように機能するべきではないのか疑問に思っています。デバッグモードのように機能させるには、他に何をオフにする必要がありますか?

リリースモードで動作するがデバッグモードでは動作しない場合は、コーディング障害である可能性がありますが、逆の場合は奇妙に見えます。ではない?

助けていただければ幸いです。-ニマ

4

4 に答える 4

4

デバッグモードでは、多くの場合、ヒープデータの割り当てが初期化されます。プログラムはこの動作に依存している可能性があります。初期化されていない変数とバッファーを探します。

于 2010-05-27T18:07:26.953 に答える
2

1)プリプロセッサマクロに依存するすべてのコードを再確認します。
2)プログラム状態の前提条件を検証するためにassert()を使用します。assertはマクロであるため、これらがプログラムフローに影響を与えることを期待してはなりません(つまり、チェックを削除しても、コードは同じ最終結果を提供できます)。アサーションが実行されない場合は、通常の実行時条件を使用します。
3)実際、変数を初期化されていない状態のままにしないでください。

于 2010-05-27T18:09:29.097 に答える
1

最も可能性の高い説明は、初期化されていないメモリによって引き起こされる2つのモードでの未定義の動作の違いです。デバッグとリリースの間でタイミング環境が異なるため、スレッドセーフの欠如や同期コードの問題もこの種の動作を示す可能性がありますが、プログラムがマルチスレッドでない場合は、明らかにこれは不可能です。

于 2010-05-27T18:24:15.830 に答える
1

私はこれを経験しました、そして私の場合、それはXインデックスだけを持っていると思われる構造体の配列の1つが原因でした、しかしこの構造体をチェックする私のループはX+1インデックスへのチェックを超えていました。興味深いのは、Visual C ++ 2005を使用していたにもかかわらず、デバッグモードが正常に実行されていたことです。

バグをキャッチするために、printfを1行ずつコーディングに挿入して数時間を費やしました。誰でもこの種のエラーをデバッグする良い方法があります。私に知らせてください。

于 2013-06-06T11:12:24.090 に答える