「フル」または「pdbのみ」のデバッグ情報を使用してリリースビルドをコンパイルする必要がありますか?


114

Visual Studio 2010 for C#プロジェクトで、[プロジェクトのプロパティ]> [ビルド]> [詳細]> [デバッグ情報]の順に移動すると、なし、完全、またはpdbのみの3つのオプションがあります。この質問への回答に基づいて、フルとpdbのみの違いのいくつかを理解していると思います。しかし、どちらがリリースビルドに適していますか?「完全」を使用すると、パフォーマンスに影響がありますか?「pdb-only」を使用すると、本番環境の問題のデバッグが難しくなりますか?

「フル」と「pdbonly」の違いは何ですか?https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/compiler-options/debug-compiler-option


pdb-onlyまたはnone、常にリリースビルド用。
レッピー

13
@leppieありがとうございますが、私はその立場の正当化を求めています。
RationalGeek


パフォーマンスに影響がない場合は、これは素晴らしいことです。メモリへの影響はどうですか?StackTraceのインスタンスを作成してファイル情報を要求する場合、それはpdbシンボルデータから取得する必要があります。アプリケーションの起動時にすべてのシンボルがメモリに読み込まれていますか?これのおおよそのメモリ使用量はどれくらいですか?(たとえば、コードサイズに対するオーバーヘッドの割合。)
ヨーヨー2015

回答:


90

で構築しpdb-onlyます。リリースされた製品にデバッガを接続することはできませんが、クラッシュダンプを取得した場合は、Visual StudioまたはWinDBGを使用して、クラッシュ時のスタックトレースとメモリダンプを調べることができます。

あなたが一緒に行く場合fullではなくpdb-only、あなたは実行ファイルがデバッガに直接取り付けることができることを除いて、同じ利益を得るでしょう。あなたの製品と顧客にとってこれが妥当かどうかを判断する必要があります。

クラッシュレポートが届いたときに参照できるように、PDBファイルをどこかに保存してください。これらのデバッグシンボルを格納するようにシンボルサーバーを設定できれば、はるかに便利です。

を使用してビルドすることを選択した場合none、フィールドでクラッシュが発生しても、頼ることはできません。クラッシュの事後調査を行うことはできません。これは、問題を追跡する能力を著しく妨げる可能性があります。

パフォーマンスに関するメモ:

John RobbinsEric Lippertはどちらも/debugフラグに関するブログ投稿を書いており、どちらもこの設定によるパフォーマンスへの影響はゼロであることを示してます/optimizeコンパイラーが最適化を実行する必要があるかどうかを示す別のフラグがあります。


7
@Matt、/ debugスイッチ上のMSDNの記事は、明示的に「完全な」設定を使用した場合のパフォーマンスへの影響について警告:If you use /debug:full, be aware that there is some impact on the speed and size of JIT optimized code and a small impact on code quality with /debug:full. We recommend /debug:pdbonly or no PDB for generating release code.
アロンGuralnek

3
@Matt:「フル」に「pdb-only」に比べてデメリットがなく、メリットのみがある場合、なぜ「pdb-only」が存在するのですか?「フル」以上に使用する理由はありますか?また、「コミュニティコンテンツ」セクションのMSDN記事に修正を追加する必要があります。
Allon Guralnek、2012

9
リンクされているジョン・ロビンスの記事からの@AllonGuralnekの引用:本当の理由:歴史。.NET 1.0には違いがありましたが、.NET 2.0では違いがありませんでした。.NET 4.0も同じパターンに従うようです。CLRデバッグチームとの再確認後、違いはまったくありません。
bentayloruk 2013年

5
これは真実ではありません。pdb-onlyでビルドしても、デバッガをアタッチできます。念のためにやっただけです。
マーク

2
「pdbのみでビルドします。リリースされた製品にデバッガーを接続できなくなります」ここに情報源はありますか?@Markと私が述べたように、これは正しくないようです。
MEMark 2015年

66

警告 / debugスイッチに関する MSDN ドキュメント(Visual Studioではデバッグ情報です)は古くなっているようです!これは間違っているものです

あなたが/デバッグを使用する場合:フル:、JIT最適化されたコードとと/デバッグコードの品質上の小さな衝撃の速度とサイズに多少影響があることに注意してフル。リリースコードの生成には、/ debug:pdbonlyまたはno PDB をお勧めします。

/ debug:pdbonlyと/ debug:fullの違いの1つは、/ debug:fullを指定すると、コンパイラーがを発行DebuggableAttributeすることです。

では、今は何が正しいのでしょうか?

  1. Pdbのみ – .NET 2.0以前は、リリースされた製品(顧客のマシン)からのクラッシュダンプの調査に役立ちました。しかし、デバッガーをアタッチすることはできませんでした。これは、.NET 2.0の場合とは異なります。Fullまったく同じです。
  2. 完全 –これは、クラッシュダンプの調査に役立ち、リリースビルドにデバッガーをアタッチすることもできます。ただし、MSDNの言及とは異なり、パフォーマンスに影響はありません(.NET 2.0以降)。Pdb-onlyとまったく同じです。

それらがまったく同じである場合、なぜこれらのオプションがあるのですか?John Robbins(windowsのデバッグ神)は、歴史的な理由でこれらが存在することを発見しました

.NET 1.0には違いがありましたが、.NET 2.0では違いがありませんでした。.NET 4.0も同じパターンに従うようです。CLRデバッグチームとの再確認後、違いはまったくありません。

JITterがデバッグビルドを行うかどうかを制御するのは、/ optimizeスイッチです。<…>

結論としては、/ optimize +と/ debugスイッチのいずれかを使用してリリースビルドをビルドし、ソースコードでデバッグできるようにする必要があります。

それから彼はそれを証明し続けます。

これで、最適化は別のスイッチの一部になります/optimize(Visual Studioではと呼ばれますOptimize code)。

つまり、DebugInfo設定がpdb-onlyまたはfullに関係なく、同じ結果が得られます。Noneを回避することをお勧めします。リリースされた製品またはアタッチされているデバッガーからクラッシュダンプを分析できなくなるためです。


3
素晴らしい答え!私自身の調査(生成されたファイルの比較)でも同じ結果が示されています。
MEMark 2015年

@rpattabi pdbonlyとfullが同じであるという参照を指定できますか?それは2019年であり、ドキュメントはまだそれらが異なっており、フルになるとパフォーマンスが低下することを示しています。そしてVS2019はRelease、デフォルトで設定された構成のdebugtypeでプロジェクトを作成しますpdbonly
joe

@joe MSDNドキュメントmsdn.microsoft.com/en-us/library/8cw0bt21.aspxの下部に説明があります。それを見てください。1人の寄稿者が、pdbonlyとfullが同じであると言及されている最新情報について、github.com / dotnet / roslyn / blob / master / docs / compilers / CSharp / を指摘しました。(参考までに、私はWindowsやVSをもう使用していません。そこで、私はそこで何が起こっているのか
追跡し

16

PDBのみが必要になりますが、PDBファイルをユーザーに提供する必要はありません。ただし、バイナリと一緒にそれらを自分で用意すると、クラッシュダンプをWinDbgなどのデバッガーにロードして、プログラムが実際にどこで失敗したかを確認できます。これは、アクセス権のないマシンでコードがクラッシュする場合にかなり役立ちます。

完全デバッグでは、コードに[Debuggable]属性が追加されます。これは速度に大きな影響を与えます。たとえば、シングルステップを簡単にするために、一部のループ最適化が無効になっている場合があります。さらに、トラッキングがオンになるため、JITプロセスにわずかな影響があります。


理にかなっています。とにかく、ユーザーにDLLを実際に配布することはありません。これはASP.NETアプリです。しかし、あなたはあなたの答えを強化し、「pdb-only」と「full」で行くべき理由を正当化できますか?パフォーマンスの問題ですか?
RationalGeek

@jkohlhepp:(JITにより)情報が失われるため、リリースビルドのデバッグは少しトリッキーですが、追加したいと思います。ほとんどの場合、メソッドの引数の値を確認することはできません。これを回避するには、thisを使用して一時的にJIT最適化を無効にします
Ilian Pinzon

blowdartに感謝し、追加情報についてIlian Pinzonに感謝します。私はあなたがリリースコードで完璧なデバッグを得ることができないことを知っていますが、PDBを持つことは何もないよりはましです。
RationalGeek

「完全」設定を使用しても、パフォーマンスへの影響はありませ。デバッガーを実行中のプロセスにアタッチするだけです。
マットディラード

1
MSDN Mattの良い質問、msdn.microsoft.com/en-us/library/8cw0bt21、自分で答えを待っています。
ルークハットン

4

未処理の例外ハンドラーを作成している最中です。pdb-onlyを使用すると、スタックトレースに行番号が含まれます。それ以外の場合は、[なし]を選択すると、Sub / Functionの名前が表示されます。

.pdbを配布しない場合、pdbのみのビルドでも、スタックトレースの行番号を取得できません。

したがって、私はVBアプリからのexeファイルとともにpdbを配布(XCOPYをLANに配置)しています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.