.pdbファイルを生成するリリース、なぜですか?


264

.pdbリリースでコンパイルするときにVisual Studio 2005がファイルを生成するのはなぜですか?私はリリースビルドをデバッグしないので、なぜ生成されるのですか?


18
なぜ実際にpdbを生成するのですか?そのため、クラッシュレポートが最初から届くと、デバッグするための情報が得られます。もう1つの価値は、元の作成者がデバッグできないときに顧客がデバッグできることです。
イアン・ボイド

@IanBoyd:そのコメントの2番目の文は、PDBをデプロイすることを意味します。これは、ほとんどの場合望ましくありません。
IInspectable 2017年

3
@IInspectableまたは望ましい
Boyd

@IanBoyd:ほとんどの場合、OSの展開は含まれません。さらに、これらのPDBには、PDBを生成するときにデフォルトで含まれるプライベートシンボルが含まれていません。
IInspectable 2017年

@IInspectable一方、PBDを解放すること望ましいです。理想的には、はい、だれでもILにコンパイルされたコードを記述して、シンボル情報を自分で取得できるようにします。しかし、ネイティブコードコンパイラには、フィールドでのデバッグをサポートする簡単な方法がまだありません。
Ian Boyd 2017年

回答:


416

PDBファイルがないと、アドレスレベルのデバッグ以外の方法で「リリース」ビルドをデバッグすることができないためです。最適化は実際にコードで数値を計算するため、問題が発生した場合(たとえば、例外がスローされた場合)に原因を特定することが非常に困難になります。生成されたアセンブリコードとソースコードの行を1対1で(または同じ順序で)一致させることができないため、ブレークポイントを設定することも非常に困難です。PDBファイルは、ユーザーとデバッガーを助け、事後デバッグを大幅に容易にします。

あなたのソフトウェアがリリースの準備ができていれば、それまでにすべてのデバッグを行うべきだったということをあなたは主張します。それは確かに真実ですが、覚えておくべき重要な点がいくつかあります。

  1. "リリース"ビルドを使用して、アプリケーションをリリースする前にテストおよびデバッグする必要あります。これは、最適化をオンにすると(「デバッグ」構成ではデフォルトで無効になっている)、他の方法ではキャッチできないような微妙なバグが発生する場合があるためです。このデバッグを行うときは、PDBシンボルが必要になります。

  2. お客様は、「理想的な」条件下でのみ発生するエッジケースやバグを頻繁に報告します。これらは、ユーザーのマシンの奇抜な構成に依存しているため、ラボで再現することはほとんど不可能です。彼らが特に役立つ顧客であれば、スローされた例外を報告し、スタックトレースを提供します。または、リモートでソフトウェアをデバッグするためにマシンを借りることもできます。どちらの場合も、PDBファイルが役立ちます。

  3. プロファイリングは常に、最適化を有効にした「リリース」ビルドで行う必要があります。また、PDBファイルは、プロファイルを作成するアセンブリ命令を、実際に記述したソースコードにマップして戻すことができるため、重宝します。

コンパイル後に PDBファイル戻って生成することはできません。*ビルド中にそれらを作成しないと、機会を失っています。それらを作成するために何も害はありません。それらを配布したくない場合は、バイナリから除外することができます。しかし、後でそれらを使用することを決定した場合、あなたは運が悪いです。必要な場合に備えて、常にそれらを生成してコピーをアーカイブすることをお勧めします。

本当にそれらをオフにしたい場合は、それは常にオプションです。プロジェクトの[プロパティ]ウィンドウで、変更する構成の[デバッグ情報]オプションを[なし]に設定します。

ただし、「デバッグ」と「リリース」の構成で、デフォルトでデバッグ情報の出力に異なる設定が使用されることに注意してください。この設定を保持する必要があります。デバッグビルドでは、「デバッグ情報」オプションが「フル」に設定されています。つまり、PDBファイルに加えて、デバッグシンボル情報がアセンブリに埋め込まれています。エディット・アンド・コンティニューなどのクールな機能をサポートするシンボルも入手できます。リリースモードでは、 "pdb-only"オプションが選択されています。これは、サウンドのように、アセンブリの内容に影響を与えずにPDBファイルのみを含みます。したがって、/binディレクトリにPDBファイルが存在するかどうかだけでは、それほど単純ではありません。ただし、「pdb-only」オプションを使用すると仮定すると、PDBファイル '

*として、マルク・シャーマンは、コメントで指摘している限り、あなたのソースコードが変更されていない(あるいはあなたがバージョン管理システムから、元のコードを取得することができます)として、あなたはそれを再構築して、一致するPDBファイルを生成することができ、。少なくとも、通常は。これはほとんどの場合うまく機能しますが、コンパイラーが同じコードをコンパイルするたびに同じバイナリーを生成することは保証されていないため、微妙な違いがある場合あります。さらに悪いことに、その間にツールチェーンをアップグレードした場合(Visual Studioのサービスパックの適用など)、PDBが一致する可能性はさらに低くなります。事後の信頼できる世代を保証するPDBファイルの場合、バージョン管理システムのソースコードだけでなく、ビルドツールチェーン全体のバイナリもアーカイブして、ビルド環境の構成を正確に再作成できるようにする必要があります。言うまでもなく、PDBファイルを作成してアーカイブする方がはるかに簡単です。


19
「コンパイル後にPDBファイルを生成することはできません。」-ソースコードが変更されていない場合は、事後、再構築して使用可能なPDBを生成できます。デフォルトでは、windbgはこのPDBをロードしませんが、このように/ iオプションを指定することで強制的にロードすることができます.reload /i foo.dll。foo.dllの解放後にfoo.pdbが作成された場合でも、foo.pdbが読み込まれます。
Marc Sherman、

新しいコンパイルごとにハッシュダイジェストが異なるため、同じ環境であってもビルドごとに若干の違いがあることに気付きました。PDBのアドレスは変動しても変化しないので、PDBをそのビルドから遠ざける必要がありますか?PDBのしくみや、ビルド間でハッシュが変化する理由がわからないので、これをアイデアとして出してください。
thebunnyrules 2017年

1
@The脚注では、私はにリンクされている記事と説明し、設計することにより、C#コンパイラは、決して二度同じバイナリを生成しません」。C#コンパイラは、すべてのアセンブリに新鮮に生成されたGUIDを埋め込み、あなたがそれを実行するたびに、それによって確保なし2つのアセンブリいますビットごとにまったく同じです。」これが、ハッシュが異なるためにPDBファイルが異なる理由を説明しています。これは16進エディターで修正できますが、ユーザーフレンドリーではありません。また、この回答の範囲外です。
コーディグレイ

3
Roslynには、確定的ビルドと呼ばれる新機能があります。「/ deterministicフラグを指定すると、コンパイラーは、同じ入力が与えられると、バイトごとにまったく同じEXE / DLLを生成します。」これが意味することは、このフラグを使用して元々コンパイルされたプロジェクトであり、コンパイルしているコードが同じである限り、まったく同じバイナリに再コンパイルできます。より長い説明は、Roslyn
K Smithの

92

PDBはRelease、およびに対して生成できますDebug。これは次のように設定されます(VS2010ではVS2005でも同様にする必要があります):

プロジェクト→プロパティ→ビルド→詳細設定→デバッグ情報

に変更してくださいNone


2
しかし、なぜそうするのでしょうか。ソフトウェアがリリースの準備ができている場合は、それまでにすべてのデバッグを完了している必要があります
m.edmondson

4
生産の問題をデバッグできるからです。一度やらなければならなかった。
Aliostad '28年

21
プロダクションコード用にPDBを使用する利点は、.NETが例外をスローするときにこれらのファイルを使用することです。ファイル名と行番号を含むスタックトレースを生成します。これは、多くの場合非常に便利です。
Steven

6
@ m.edmondson:はい、そうです。スローされた例外(のようにFileNotFoundException)何であるかは通知されますが、スタックトレースを表示することはできません。これにより、例外がスローされる原因となったコードを正確に特定することが非常に困難になります。
コーディグレイ

2
@ m.edmondsonプロダクションボックスの問題の1つをリモートでデバッグするツールを探している場合に追加すると、Windows SDKには、リモートデバッグをサポートするWinDbgと呼ばれる非常に有名なツールが付属しています。下記リンク先をご覧ください。お役に立てれば!msdn.microsoft.com/en-in/library/windows/hardware/...
RBT

8

.pdbファイルがないと、実稼働コードをステップ実行することは事実上不可能です。コストと時間がかかる他のツールに依存する必要があります。たとえば、トレースやwindbgを使用できることを理解していますが、それは実際に達成したいことに依存しています。特定のシナリオでは、本番データを使用してリモートコード(エラーや例外なし)をステップスルーして特定の動作を観察するだけで、.pdbファイルが役立ちます。それらなしでそのコードでデバッガーを実行することは不可能です。


7

リリースビルドをデバッグしないのはなぜですか。ときどき(まれに起こりますが、起こります)何らかの理由(異なるタイミング、小さな異なる動作など)でデバッグバージョンで再現できない顧客からの欠陥レポートを受け取ることがあります。その問題がリリースビルドで再現可能であると思われる場合は、対応するpdbを用意してください。


5
@ m.edmondson RDP、Webexなどを使用してリモートマシンにアクセスし、そこにwindbgをインストールします。あなたのシンボルパスとBAMを設定してください、あなたは黄金です!
Marc Sherman

より詳細なガイドへのリンクが役立つと思います。この1行のハウツーは、人々(私のような)を間違った方向に導く可能性があります。ほとんどの.NET開発者は、たとえばWindbgについて何も知りません。
nuzzolilo 2014

1
@ m.edmondson-Visual Studioの一部のエディションには、リモートデバッグを実行する機能があります。デバッグメニューから、リモートマシンで「処理にアタッチ」します。
マシュー14年

本番アプリケーションインスタンスをリモートデバッグするのは、とても良い考えですか?スレッドの並列実行を中断し、デバッグ中に強制的にシリアルで実行しませんか?
Kaveh Hadjari 2016

4

また、クラッシュダンプを利用してソフトウェアをデバッグすることもできます。顧客はそれをあなたに送信し、それを使用してソースの正確なバージョンを識別できます-Visual Studioは、クラッシュダンプを使用してデバッグシンボル(および正しく設定されている場合はソース)の適切なセットをプルします。シンボルストアに関する Microsoftのドキュメントを参照してください。


2

.PDBファイルは、「プログラムデータベース」の短い名前です。デバッガーのデバッグポイントと使用または参照されるリソースに関する情報が含まれています。デバッグモードでビルドしたときに生成されます。実行時にアプリケーションがデバッグできるようにします。

サイズは、デバッグモードでの.PDBファイルの増加です。アプリケーションをテストするときに使用されます。

pdbファイルの良い記事。

http://www.codeproject.com/Articles/37456/How-To-Inspect-the-Content-of-a-Program-Database-P


1
「リリースまたはデプロイ時にこのファイルは不要」は、そのリリースされたバージョンで誰かがクラッシュし、それらから取得したクラッシュレポートに使用可能なスタックトレースが含まれていない場合を除いて、その後に含める必要があります。すべて。
Nyerguds 2017年

違います。.pdbファイルがないと完全なスタックトレースが得られますが、ソースファイル名はありません。クラッシュレポートを受け取ったら、社内で回復できます。知的所有権を気にし、ソースを難読化する場合は、.pdbファイルを保存する必要がありますが、展開する必要はありません。
TOP KEK

1

マルチプロジェクトソリューションでは、通常、PDBまたはXMLファイルをまったく生成しない1つの構成が必要です。Debug Infoすべてのプロジェクトのプロパティをに変更する代わりnoneに、特定の構成でのみ機能するビルド後のイベントを追加する方が便利だと思いました。

残念ながら、Visual Studioでは、構成ごとに異なるビルド後のイベントを指定することはできません。そこでcsproj、スタートアッププロジェクトのファイルを編集し、次のコードを(既存のPostBuildEventタグの代わりに)追加することで、これを手動で行うことにしました。

  <PropertyGroup Condition="'$(Configuration)' == 'Publish'">
    <PostBuildEvent>
        del *.pdb
        del *.xml
    </PostBuildEvent>
  </PropertyGroup>

残念ながら、これによりビルド後のイベントテキストボックスが空白になり、そこに何かを入れると予測できない結果が生じる可能性があります。


4
これによりすべての*.xmlファイルが削除されますので、注意してください。
Mariusz Jamro 2017

0

デバッグシンボル(.pdb)およびXML doc( .xml)ファイルは、合計サイズの大部分を占めており、通常の展開パッケージの一部ではありません。ただし、必要な場合にアクセスできるようにする必要があります。

1つの可能なアプローチ:TFSビルドプロセスの最後に、それらを別のアーティファクトに移動します。


-1

実際、PDBファイルとシンボリック情報がないと、正常なクラッシュレポート(メモリダンプファイル)を作成できず、Microsoftは問題の原因を完全に把握できません。

PDBを使用すると、クラッシュレポートが改善されます。


しかし、.pdbファイルがないと、正確には何が欠けているのでしょうか。
TOP KEK

コンパイル後にPDBファイルを生成することはできません。したがって、何が起こったかを正しく理解するために、ソフトウェアのすべてのバージョンのmajor.minor [.build [.revision]]をMicrosoftに保存しておく必要がありますが、これだけではありません。
prosti

コンパイラは、同じコードをコンパイルするたびに同一のバイナリを生成することは保証されていません。
prosti

問題は、クラッシュレポートに欠けているものと、クラッシュレポートへの影響です。.NET pdbファイルには、プライベート変数名とソースファイル名のみが含まれます。それ以外のすべて(メソッド名、署名など)は、メタデータ情報からスタックトレースに入ります。
TOP KEK

PDBファイルには非プライベートデータも含まれていません:github.com/microsoft/microsoft-pdb
prosti
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.