web-dev-qa-db-ja.com

.NETでのデバッグとリリース

私の 前の質問 から続けて、C#アプリケーション、特にWebアプリケーションでのデバッグモードとリリースモードの間で利用可能なすべての違いをリストした包括的なドキュメントはありますか?

どのような違いがありますか?

55
MichaelT

「デバッグ」と「リリース」は、Visual Studioによって定義された定義済みのプロジェクト構成の単なる名前です。
違いを確認するには、Visual Studioのプロジェクトプロパティの[ビルド]タブを確認してください。

VS2005の違いは次のとおりです。

  • デバッグ構成で定義されたDEBUG定数

  • リリース構成で有効化されたコードの最適化

「詳細」ボタンをクリックすると表示される他の違いと同様に

でも君ならできる:

  • プロジェクトプロパティ/ビルドのデバッグおよびリリース構成のビルド設定を変更する

  • ソリューションエクスプローラーでソリューションを右クリックし、[構成マネージャー]を選択して、独自のカスタム構成を作成します。

DEBUG定数の動作はかなり明確だと思います(#ifプリプロセッサディレクティブまたはConditionalAttributeで参照できます)。しかし、どの最適化が有効になっているかについての包括的なドキュメントは知りません。実際、Microsoftは事前に通知せずにオプティマイザを自由に拡張したいと思っています。

49
Joe

違いを記載したドキュメントはありません。上記のいくつかの違いに加えて、デバッグモードでコンパイルすると、実行時に実行されるほとんどのJITコンパイラ最適化がオフになり、さらに完全なデバッグ情報がシンボルデータベースファイル(.pdb)に出力されます。

もう1つの大きな違いは、JITコンパイラがデバッグセッションをサポートするために、GC.KeepAlive()適切/必要に応じてへの呼び出しを挿入するという点で、GCの動作が多少異なることです。

15
Scott Dorman

簡潔なドキュメントは1つも知りませんが、

  • Debug.Write呼び出しはリリースで削除されます
  • リリースでは、CallStackは Scott Hanselman で概説されているように、最適化のために少し奇妙に見えるかもしれません。
13
Michael Stum

デバッグとリリースは、さまざまなソリューション構成の単なるラベルです。必要に応じて、他のユーザーを追加できます。必要に応じて、構成マネージャーから構成を追加できます–

http://msdn.Microsoft.com/en-us/library/kwybya3w.aspx

主な違い–

1.デバッグdllに、Visual Studioのすべてのソースコード行にブレークポイントを設定できるように、いくつかの追加の命令が追加されています。また、コードを最適化せず、コードをデバッグできるようにします。リリースバージョンでは、これらの余分な指示は削除されています。

2.PDBファイルは、デバッグモードでのみ作成され、リリースモードでは作成されません。

3.リリースモードでは、cpdeはJITコンパイラに組み込まれているオプティマイザによって最適化されます。次の最適化を行います。

•メソッドのインライン化-メソッド呼び出しは、メソッドのコードを挿入することで置き換えられます。

•CPUレジスタの割り当て-ローカル変数とメソッド引数は、スタックフレームに戻されることなく(または頻度が低く)CPUレジスタに格納されたままにできます。

•配列インデックスチェックの削除-配列を操作する際の重要な最適化(すべての.NETコレクションクラスは内部で配列を使用します)。 JITコンパイラーは、ループが範囲外の配列にインデックスを付けないことを確認できる場合、インデックスチェックを排除します。

•   Loop unrolling -  Short loops (up to 4) with small bodies are eliminated by repeating the code in the loop body. 

•   Dead code elimination - A statement like if (false) { /.../ } gets completely eliminated. 

•   Code hoisting- Code inside a loop that is not affected by the loop can be moved out of the loop.

•   Common sub-expression elimination. x = y + 4; z = y + 4; becomes z = x
9
Chetan Naithani

ASP.NET Ajaxコントロールのいずれかを使用している場合の1つの主要なパフォーマンス領域:リリースで実行すると、JavaScriptライブラリからデバッグ情報が削除され、複雑なページでパフォーマンスが大幅に向上しました。他のWebベースのリソースは、この設定に基づいてキャッシュされる場合とされない場合があります。

また、ウェブアプリケーションのデバッグ/リリースはweb.configファイル。VisualStudio内の設定ではありません。

<system.web>
    <compilation debug="true">

詳しくは:

5
andleer

GDI +での描画は、デバッグモードではかなり遅くなります。

4
Hallgrim

デバッグでのみ、またはプリプロセッサマークアップを使用したリリースでのみ実行するコードの一部を管理することもできます。

 #if DEBUG
    // Some code running only in debug
 #endif

または

 #if NOT DEBUG
    // Some code running only in release
 #endif
3
Samuel Poirier

リリースバージョン:

  1. かなり速く(最も重要)、最適化されている

  2. デバッグできません(ステップバイステップ)

  3. 「デバッグ」ディレクティブで記述されたコードは含まれていません

デバッグとリリースビルドの違いは何ですか?を参照してください。

2
Dani

実行可能ファイルを別のマシンに配布すると、システムがMSVCP110D.dllを見逃したことを示すエラーメッセージが表示されました。

この問題の解決策は、スタックオーバーフローの質問Visual Studio MSVCP110D.dllがないに記載されています。

IN XXXXD.dll Dは、DLLファイルがDLLファイルのデバッグバージョンであることを意味します。ただし、MS Visual C++再頒布可能パッケージには=のリリースバージョンのみが含まれます。 DLLファイル。

つまり、 Visual C++ で開発されたプログラムを配布する必要がある場合は、リリースモードでビルドする必要があります。また、あなたもターゲットマシンにMS Visual C++再頒布可能パッケージ(正しいバージョン)をインストールする必要があります。

したがって、これはデバッグモードとリリースモードの主な違いの1つだと思います。

1
mili