リリースバージョンで.pdbファイルが生成され、すべての行にステップインしたり、ブレークポイントを設定したりできる場合は、なぜわざわざコンポーネントの「デバッグ」バージョンを作成する必要があるのでしょうか。
プロジェクトにc#を使用していますが、リリースバージョンのデバッグに問題はありませんでした。C ++では、最適化されたコードのデバッグに問題がありましたが、C#では正常に動作します。私はif(false)
...のようなばかげたコードブロックについて話しているのではありません。
リリースバージョンで.pdbファイルが生成され、すべての行にステップインしたり、ブレークポイントを設定したりできる場合は、なぜわざわざコンポーネントの「デバッグ」バージョンを作成する必要があるのでしょうか。
プロジェクトにc#を使用していますが、リリースバージョンのデバッグに問題はありませんでした。C ++では、最適化されたコードのデバッグに問題がありましたが、C#では正常に動作します。私はif(false)
...のようなばかげたコードブロックについて話しているのではありません。
リリースビルドはより最適化されています。たとえば、リリースビルドをデバッグすると、ローカル変数の値がランタイムで使用されなくなると、その値が消えてしまいます。
1つの理由は、アタッチと起動です。
.NetでRetailプロセスを起動する場合、デバッグはDebugプロセスを起動するのとほぼ同じです。デバッグエクスペリエンスの違いに気付かない可能性があります。
アタッチは完全に異なる球技です。リテールビルドでは、C#とVBの両方に/optimize+フラグが渡されます。これにより、DebuggingMode.DisableOptimizationsフラグを使用せずに、アセンブリレベルでDebuggableAttributeが埋め込まれます。プロセスの起動中に、VS / CLRは通信して、この事実を本質的に無視し、デバッグに影響を与えるJIT最適化を無効にします。アタッチ中、そのようなアイテムは発生せず、JIT/CLRはその心のコンテンツに最適化されます。この場合、デバッグエクスペリエンスははるかに悪くなります。
VSでこれを試すことができます
(c#)winformsでは、リリースビルドで編集および続行することはできません。
他の回答とは別に、キャッチさ#define DEBUG
れていない例外が発生したときの動作を変更するために、自動的に生成されたものを使用します。
いくつかの理由があります:
Debug.Assert
etcへの呼び出しはすべて削除されます。もちろん、これの多くはビルド構成で変更できます。かなり一般的なアプローチの1つは、リリースビルドにデバッグ情報を追加することを除いて、デフォルト設定をそのままにしておくことです。これにより、より有用なスタックトレースが得られます(デバッガーを使用する場合は、デバッグエクスペリエンスが向上します)。
リリースビルドは、デバッグビルドよりも追加の最適化を実行しますが、デバッグビルドは、デバッグセッションの途中でオブジェクトが収集されないように、GCの動作もわずかに変更します。デバッグビルドは、デバッグセッションに悪影響を与えるJIT中に特定の最適化が発生するのも防ぎます。
Lennaert に同意します。ビルド間で異なるエラー処理を行う傾向があります。たとえば、一部のアプリについては、デバッグ ビルドで非常に精力的です。事前条件と事後条件、アサーション、例外など。基本的に、開発者にライブラリを正しく使用するように強制しようとしています。一方、リリースビルドでは、パフォーマンスを向上させるために条件を緩和します。
Design by Contractを使用する場合、 Preconditions、Postconditions、およびClass Invariantsをチェックしないリリース ビルドと、それらを ( assertionsを介して) チェックするデバッグ ビルドの 2 つのビルドを用意することが重要です。
場合によっては、前提条件チェックがリリース モード (関連する質問を検索) でアクティブなままになることがありますが、それで話全体が変わるわけではありません。
In the development phase you check all of your contract assumptions, and when you release, you don't check them anymore - you know you have tested the code and it works, so you just rely on your previous assumptions - that's why they were intended for in the first place.