2017-04-20 19 views
0

32ビットWindowsコマンドラインプログラムを開発する際に、デバッグバージョンが期待通りに動作していて、ない。今、これは20年以上前の珍しい問題ではありませんでした。リリース版では、コンパイラの最適化が有効になり、現在でもコンパイラの最適化がすべてのケースで有効であるとは限りません。したがって、過去にこの問題が発生した場合は、コンパイラの最適化をオフにします。今回はすべての最適化を無効にし、問題は残っていました。デバッグバージョンとリリースバージョンの唯一の違いは、一連のコンパイラとローダーの設定になります。私たちは戻って、リリース設定をデバッグ設定と一致するように変更しました。問題は残りました。私たちはこれまで一度も見たことがない。MS Visual C++リリースとデバッグビルドの動作が異なる可能性があります

これは、すべて32ビットWindows用に一般的に使用されているVC6プラットフォーム上にあります。それは正しいMicrosoft Visual C++ 6.0です。 VC6に対する私たちの好みは、VC6までのC/C++パッケージのすべてのバージョンでMicrosoftのベータテスターであり、オプティマイザのデバッグに非常に積極的でした。しかし、VC8には本当の問題はなかったので、私たちはそれを試みました。この場合は、私たちが使用していたプロジェクトをVC8に変換するだけでした。私の驚いたことに、私はVC8がまったく同じ問題を抱えていることを発見しました。デバッグバージョンは動作し、リリースバージョンは動作しません。私たちはVC8の中から最初から作り出すことを試みるかもしれませんし、それが違いを生むかどうかを見てみましょう。この時点では、これはまったく理解できません。私たちが紛失している場所にコンパイラスイッチを設定する必要があります。それとも?

ほかに、リリースとデバッグビルドの違いは何ですか?

+2

デバッグとリリースのビルドの動作が異なると、初期化されていないメモリまたは変数をどこかで使用していることを示すサインになる可能性があります。 –

+2

私はVCがリリースではなくデバッグでいくつかの余分なスタックスペースを割り当てているのを見ました。おそらく、スタックで割り当てられた配列のいくつかの境界から外れて、おそらくリリースで現れます。これは、アセンブラを調べることで確認できます。 –

+0

@Paul Ogilvie観測のおかげで、それを見ていきます。 –

答えて

1

一般に、デバッグ実行ファイルは、いくつかの点でリリース実行ファイルとは異なります。これは、実行可能ファイルのファイルサイズを見るだけで分かります。考えられる原因は、リリースが高レベルを持っている可能性がある一方、

  • デバッグは、
  • デバッグは、一般的に最適化を無効にしているエラーチェックを行うことでコンパイルされ、追加のコードを持っていることがあります。
  • デバッグでは、自動変数をゼロに初期化することがありますが、リリースは初期化されません。
  • Debugは、実行可能コードをソースコードに関連付けるための追加情報を持ちますが、Releaseはそうではありません。

私の最善のアドバイスは、たとえ愚かであっても、すべての変数を初期化することです。すべてのメモリ割り当てが機能し、スコープが適切に解放されていることを確認します。

上記のスタティックアナライザのコメントは優れたアドバイスです。より新しいコンパイラでコンパイルすることで、同様の利点が得られます。

CPPCHECK、または多くの商用チェッカーの1つを見てください。

どの場合でも最新のコンパイラにアップグレードすることをお勧めします。

Best of Luck。

悪。

+0

ありがとうございます –

+0

3つ目の箇条書きに、すべてのグローバル変数を標準に従って "vaueまたは0に"初期化する必要があるため、 "_automatic_"を追加してください。 VC Debugは自動変数をマーカー値に初期化します。 –

+0

4番目の箇条書きには、追加情報は含まれていますが、追加コードは含まれていない可能性があります。そして、この_情報_は行動に影響を与えることはできません。 –

1

デバッグの実装は、可能性のあるサニティチェック(特に未定義のビヘイビアの場合)により、リリースと異なる結果になる場合があります。

良い例:NaNを持つstd::minまたはstd::maxを使用して(Why does Release/Debug have a different result for std::min?を参照してください)(私は関数の実装を分析したところmy own answerを参照してください)リリース/デバッグで異なる結果が得られます。

+0

この点をありがとうございました。我々はそれを見ます。 –

関連する問題