4

リリースバージョンで.pdbファイルが生成され、すべての行にステップインしたり、ブレークポイントを設定したりできる場合は、なぜわざわざコンポーネントの「デバッグ」バージョンを作成する必要があるのでしょうか。

プロジェクトにc#を使用していますが、リリースバージョンのデバッグに問題はありませんでした。C ++では、最適化されたコードのデバッグに問題がありましたが、C#では正常に動作します。私はif(false)...のようなばかげたコードブロックについて話しているのではありません。

4

8 に答える 8

8

リリースビルドはより最適化されています。たとえば、リリースビルドをデバッグすると、ローカル変数の値がランタイムで使用されなくなると、その値が消えてしまいます。

于 2009-03-11T14:12:32.190 に答える
7

1つの理由は、アタッチと起動です。

.NetでRetailプロセスを起動する場合、デバッグはDebugプロセスを起動するのとほぼ同じです。デバッグエクスペリエンスの違いに気付かない可能性があります。

アタッチは完全に異なる球技です。リテールビルドでは、C#とVBの両方に/optimize+フラグが渡されます。これにより、DebuggingMode.DisableOptimizationsフラグを使用せずに、アセンブリレベルでDebuggableAttributeが埋め込まれます。プロセスの起動中に、VS / CLRは通信して、この事実を本質的に無視し、デバッグに影響を与えるJIT最適化を無効にします。アタッチ中、そのようなアイテムは発生せず、JIT/CLRはその心のコンテンツに最適化されます。この場合、デバッグエクスペリエンスははるかに悪くなります。

VSでこれを試すことができます

  • ビルドをリリースに切り替えます
  • デバッグなしで起動するにはCTRL+F5
  • プロセスにアタッチします。
于 2009-03-11T14:14:35.087 に答える
5

(c#)winformsでは、リリースビルドで編集および続行することはできません。

于 2009-03-11T14:15:05.600 に答える
3

他の回答とは別に、キャッチさ#define DEBUGれていない例外が発生したときの動作を変更するために、自動的に生成されたものを使用します。

  • リリース モードで実行している場合は、ユーザーに適切なメッセージを表示し、オプションでエラーをログに記録します。
  • デバッグ モードで実行している場合は、何もしないでください (デバッガが中断されます)。
于 2009-03-11T14:24:00.460 に答える
2

いくつかの理由があります:

  • デフォルトでは、リリースビルドにはPDBファイルにそれほど多くのデバッグ情報が含まれていません。以前はこのオプションがより目立つようになっていると思います。現在は[出力]の[詳細設定]にあり、可能な値は「none」、「full」(デバッグビルドのデフォルト)、「pdb-only」(リリースのデフォルト)です。ビルド)。
  • デフォルトでは、リリースビルドが最適化されています。これは、JITがほとんどの作業を行うため、C#では他の言語(C ++など)ほど大きな違いはありませんが、いくつかの違いがあり、それが困難になる可能性があります。リリースビルドをデバッグします。
  • デフォルトでは、リリースビルドはDEBUGシンボルを定義しないため、Debug.Assertetcへの呼び出しはすべて削除されます。

もちろん、これの多くはビルド構成で変更できます。かなり一般的なアプローチの1つは、リリースビルドにデバッグ情報を追加することを除いて、デフォルト設定をそのままにしておくことです。これにより、より有用なスタックトレースが得られます(デバッガーを使用する場合は、デバッグエクスペリエンスが向上ます)。

于 2009-03-11T14:18:34.500 に答える
0

リリースビルドは、デバッグビルドよりも追加の最適化を実行しますが、デバッグビルドは、デバッグセッションの途中でオブジェクトが収集されないように、GCの動作もわずかに変更します。デバッグビルドは、デバッグセッションに悪影響を与えるJIT中に特定​​の最適化が発生するのも防ぎます。

于 2009-03-11T14:16:14.037 に答える
0

Lennaert に同意します。ビルド間で異なるエラー処理を行う傾向があります。たとえば、一部のアプリについては、デバッグ ビルドで非常に精力的です。事前条件と事後条件、アサーション、例外など。基本的に、開発者にライブラリを正しく使用するように強制しようとしています。一方、リリースビルドでは、パフォーマンスを向上させるために条件を緩和します。

于 2009-03-11T14:32:27.867 に答える
0

Design by Contractを使用する場合、 PreconditionsPostconditions、および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.

于 2009-03-11T14:34:55.550 に答える