Visual Studioのデバッグとリリースの違いは何ですか?


回答:


114

最も重要なことは、デバッグモードでは最適化が行われず、リリースモードでは最適化が行われることです。コンパイラは非常に高度であり、コードをかなりトリッキーな低レベルで改善できるため、これは重要です。その結果、コードの一部の行がまったく命令なしで残されたり、すべてが混同されたりする場合があります。段階的なデバッグは不可能です。また、ローカル変数は不思議な方法で最適化されることが多いため、変数が「最適化されて」しまうため、ウォッチとクイックウォッチは機能しないことがよくあります。また、他にも多数の最適化があります。最適化された.NETコードをデバッグしてみてください。

もう1つの重要な違いは、このため、デフォルトのリリース設定では、広範なデバッグシンボル情報を生成する必要がないことです。これは、お気づきかもしれない.PDBファイルであり、これにより、デバッガーは、どのアセンブリー命令がどのコード行に対応するかなどを把握できます。


1
「その結果、コードの一部の行がまったく命令なしで残されるか、一部がすべて混同される可能性があります。」YUP、現在のメソッド/プロパティの名前を取得するためにStackフレームを使用してこれに
違反し

4
「最も重要なことは、デバッグモードでは最適化がないことです」-それは議論の余地があります。最も重要なことは、デバッグを可能にするデバッグ情報があることです。それはリリースにも存在しますが。
2008

どちらがデフォルトモード(デバッグ/リリース)かわかりません。一般的に私の経験では、すべてのプロジェクトはデバッグモードであり、インストーラーチームはこのリリースを処理してpdbファイルを回避し、最適化を導入します。しかし、今日、モードがリリースに変更され、ブレークポイントを使用してコードをブレークすることができない状況に遭遇しました。私は多くのことをして長い1時間試してみましたが、最終的には、現在のコンパイルモードの問題が原因であることに気付きました。@ Vlix-ご回答ありがとうございます。
kbvishnu 2013

1
これにより、デフォルトのリリース構成に準拠したアプリケーションのデバッグ中に、イミディエイトウィンドウ内でシンボルを分析しようとしたときに発生した「現在のコンテキストに「変数」という名前が存在しない」という問題が解決されました。どうもありがとう!
M463 2016年

1)次の問題についてはどうですか?ASP.NET MVCプロジェクトには、ベース(web)、デバッグ(web.debug)、リリース(web.release)の3つの構成があります。対応する構成への変換によってデバッグとリリースの接続文字列を設定すると仮定します(デバッグとリリース)。公開するときは、公開ダイアログでの選択に従って公開できます。しかし、アプリケーションを実行しているとき、[デバッグ]を選択しても、リリース構成が使用されます(ベースとデバッグ構成にデバッグ構成を設定しているため)。
ジェイソン

52

「デバッグ」と「リリース」は、実際には、ビルドとデバッグに影響を与える可能性があるさまざまな設定の2つのラベルにすぎません。

「デバッグ」モードでは、通常、次のようになります。

  • プログラムデバッグデータベースファイル。これにより、実行時にソース内でプログラムの実行を非常に厳密に追跡できます。
  • すべての最適化がオフになりました。これにより、変数の値を検査し、他の方法で最適化またはインライン化された可能性のある関数にトレースできます。
  • リリースと比較してデバッグモードで異なる動作をするコードを記述できる_DEBUGプリプロセッサ定義。たとえば、デバッグ中にのみ使用する必要があるASSERTを計測します。
  • デバッグオプションをオンにしてコンパイルされたライブラリへのリンク。これは通常、実際の顧客には展開されません(サイズとセキュリティ上の理由から)。

「リリース」モードでは、最適化がオンになり(複数のオプションが使用可能です)、_ DEBUGプリプロセッサー定義が定義されていません。ただし、通常はPDBファイルを生成する必要があります。これは、物事がより高速に実行されているときにリリースモードで「デバッグ」できると非常に便利だからです。


5
"ラベルは2つだけ"-実際、Visual Studioにはさらに作成する機能がありますこれは、プログラムのテスト中に非常に役立ちます。たとえば、私は最近、コマンドラインからファイル名を受け入れる私の仕事のためのプログラムを書きました。コマンドラインの解析をテストしましたが、一度実行すると、毎日CMDとファイル名のリストを変更したくありませんでした。条件付きコンパイルを使用してダミーのコマンドライン値を提供し、プログラムのビジネスロジックをテストできる構成を作成しました。これにより、プログラム開発の反復サイクルがはるかに速くなりました。
Brian S

9

ほとんどの場合、デバッグには、デバッグ時に役立つ多くの追加情報が含まれています。リリースモードでは、これはすべてカットされ、パフォーマンスと交換されます。


1)次の問題についてはどうですか?ASP.NET MVCプロジェクトには、ベース(web)、デバッグ(web.debug)、リリース(web.release)の3つの構成があります。対応する構成への変換によってデバッグとリリースの接続文字列を設定すると仮定します(デバッグとリリース)。公開するときは、公開ダイアログでの選択に従って公開できます。しかし、アプリケーションを実行しているとき、[デバッグ]を選択しても、リリース構成が使用されます(ベースとデバッグ構成にデバッグ構成を設定しているため)。
Jason

2)アプリケーションをデバッグモードまたはリリースモードで実行する場合、VSはベースWeb構成または対応するWeb構成(web.debug.confgまたはweb.release.config)を使用しますか?
Jason

7

プロジェクトのコンパイルオプションを実行して比較すると、違いがわかります。

質問がネイティブ/ C ++コードに関するものであると仮定します(この表現から完全に明確ではありません)。

基本的に、デバッグではすべてのコード生成の最適化がオフになっています。一部のライブラリ(STLなど)では、デフォルトでより厳密なエラーチェックが行われます(デバッグ反復子など)。より多くのデバッグ情報が生成されます(「編集して続行」など)。エラーをキャッチするためにより多くのものがコードで生成されます(ローカル変数の値は初期化されていないパターンに設定され、デバッグヒープが使用されます)。


2
@Vilx:私が同意したとき、.netタグはまだなく、visualstudioのみでした。だから私はそれがC ++だと思った。
NeARAZ 2008

6

また、明らかに、デバッグモードでは、デバッグに役立つ追加のスレッドが多数作成されます。これらは、デバッガーを接続するかどうかに関係なく、プロセスの存続期間を通じてアクティブなままです。私の関連の質問を参照してくださいここに


しかし、.NET(C ++ではない)のみですか?
Peter Mortensen

6

ビルドフラグを使用すると、ロギングと「コンソール」メッセージングを変更するためだけに使用する必要のあるさまざまなロジックが可能になること明らかですが、悪用され、低レベルだけでなく実際のビジネスロジックを劇的に変更する可能性があります。


「...劇的に変化する...実際のビジネスロジック」-私にはバグのように聞こえます!たくさんの条件付きコードがあり、理解するのが本当に難しいです。また、条件付きコードフラグの各組み合わせは、ソフトウェアのバージョンが異なるため、正確性と基本的な整合性をテストする必要があります。私のソフトウェア構築の聖書である「Code Complete」によると、私たちの「Prime Directive」は複雑さの管理です。(それは私たちが解決する#1の問題です)。無条件にさらに条件付きフラグを追加する前に、十分に検討してください。
MicroservicesOnDDD

私の上記のコメントは、最後の文がそうである限り、特にこの回答を対象としていませんでした...これは、ここに来た読者が読むべきだと私が思った追加のことです。
MicroservicesOnDDD

6

たとえばMFCを使用する場合、デバッグプロジェクトは再配布不可能なDLLバージョンとMFC90D.DLLリンクしますが、リリースビルドはなどの再配布可能なバージョンとリンクしますMFC90.DLL。これはおそらく他のフレームワークに似ています。

したがって、おそらく開発用でないマシンでデバッグビルドアプリケーションを実行することはできません。


とても本当です。顧客のところにいる間、これを一度実行しました。My Machine(TM)で動作します。
Matt Jacobsen

あなたはそれらを配布することができます..(あなたが許可されているかどうかわからない)。それらは、アプリケーションの適切な名前のサブフォルダーにある必要があります。
Andreas Reiff

@Andreas私の例では、「再配布不可」とは、Microsoftがそれらを配布することを許可していないことを意味します。
2012

4

既存のリリースビルド構成からコピーしたアプリケーションを開発したときも、この質問に興味を持ちました。

そのアプリケーションをデバッグモードで使用することに興味のある開発者がいるため、Release構成からコピーされたReleaseMyBuildという名前のこのビルド構成を作成するのに何が必要かを考えました(したがって、最適化をリリースするためのすべての設定が必要です) )混乱するビルド構成名にもかかわらず、チームを突然変更してデバッグビルドにする。

私は、プロジェクトの構成が名前であり、Joris Timmermansが言及する「設定全体」を選択するための便利な方法であると考えました。最適化されたリリースビルドとして「FOO」という名前のビルド構成を作成する設定がどのようなものであるかについての要点を知りたかったのです。

ここにその一例を示します。Visual Studio 2010の空のプロジェクトテンプレートから新しいVCXPROJを作成しました。次に、それをコピーして両方を編集しました。1つ目はデバッグコンテンツを保持し、2つ目はリリースコンテンツを保持します。ここに、関連する違いを中心とした差分があります...

空のVCXPROJのデバッグとリリースの差分

リリース

<PropertyGroup>
    <WholeProgramOptimization>true</WholeProgramOptimization>

<ClCompile>
    <Optimization>MaxSpeed</Optimization>
    <FunctionLevelLinking>true</FunctionLevelLinking>
    <IntrinsicFunctions>true</IntrinsicFunctions>
<Link>
    <EnableCOMDATFolding>true</EnableCOMDATFolding>
    <OptimizeReferences>true</OptimizeReferences>

デバッグ

<PropertyGroup>
    <UseDebugLibraries>true</UseDebugLibraries>`

<ClCompile>
    <Optimization>Disabled</Optimization>

興味深いのは、リンクセクションで両方がGenerateDebugInformationtrueに設定されていることです。


3

明らかな違いは、バイナリのサイズです。デバッグビルドは、リリースビルドよりも大きなバイナリを生成します。

Debugでコンパイルすると、シンボルテーブルがコードファイルのコンパイル済みオブジェクトに追加され、デバッグプログラムがこれらのバイナリを利用してオブジェクトや変数の値にアクセスできるようになります。

もう1つの観察可能な違いは、リリースモードでは、デバッグモードではバイナリが致命的なエラーでクラッシュするだけです。VisualStudioでアプリケーションのデバッグを開始すると、エラーステートメントの正確な場所を示すコールスタックを確認できます。 。


-15

実際には簡単に入手できる情報がないため、正確な違いが何であるかはわかりません。

しかし、主な違いは、リリースバージョンが結果のDLLファイルを破損することがあり、アプリケーション、Webアプリケーションが使用できなくなることです。

悲しいことに、デバッグビルドを本番環境に置く必要があります。そして、はい、公開するには古き良きFTPを使用する必要があります。


7
これはどのように質問に答えますか?また、入力するときは注意してください。
mmking 2015年

同様の問題がありました。コードはデバッグモードで動作しますが、リリースモードでは問題があります。問題は私のコードにあることがわかりました。リリースバージョンの一般的な問題に関するすばらしい記事があります。これが他の人にも役立つことを願っています。
Weihui Guo 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.