Releaseビルド時のみ例外が発生する場合(Visual Studio)

Visual Studio にて C# アプリケーションを作っているとき、Debug では発現しないのに、配布用の EXE ではバグが出た。Release ビルドの EXE で発現するようだ。

調べてみたところ、Release の構成では、[コードの最適化]のデフォルト値がチェック状態となっている。Debug ではアンチェック状態。

ソリューションエクスプローラーのプロジェクトのプロパティから[ビルド]タブを選択し[コードの最適化]を確認。

Releaseビルドの構成では、コードの最適化が走って、ソースが変更されてコンパイルされ、Debug と異なる挙動をするようになっていた模様。このReleaseの[コードの最適化]チェックを外してリビルドすると、バグは取れた。

そもそも、最適化が走ると挙動が変わるようなプログラムを書くこと自体が不味いのだけれど、色々あってそうせざるを得ない場合もある。今回のケースだと、シグナルにてスレッドを止めていて非到達となる部分がある。GC対策でそうしているのだけれど、最適化が崩してしまうのだろう。

もし、Debug と Release の EXE の挙動が違う場合は、最適化を疑おう。