web-dev-qa-db-ja.com

Visual Studio:リリースビルドのデバッグ情報

顧客に提供するリリースビルドにデバッグ情報を含めたいと思っています。私が見る限り、唯一の欠点は、バイナリファイルのサイズが25%増加することです。利点は、すぐに使用できるクラッシュダンプを取得でき、分析がはるかに簡単になることです。私は25%の増加で生きたいと思っています。私が見逃している他の欠点はありますか?

これはCプロジェクトであり、私がやりたいのはリンク/デバッグ/デバッグ情報の生成だけです

28
MK.

実行可能ファイルのサイズは25%よりはるかに少なくなるはずです。

実際、それが大幅に増加することに少し驚いていますが、いくつかの簡単なテストでは、少なくとも1つの大きなサンプルプロジェクト(ScummVM)が、/DEBUGオプションをに追加するだけで.exeを10,205,184バイトから10,996,224バイトに増加させることが示されています。リンクステップ(約8%の増加)。 /DEBUGは、IDEの"Linker | Debugging | Generate Debug Info"オプションを使用して指定されます。この設定shouldは、コンパイラーによって生成される最適化に影響を与えないことに注意してください。

.pdbファイルへのポインターが実行可能ファイルに配置されていることは知っていますが、それほど多くはありません。少し実験してみたところ、/OPT:REFリンカーオプションを有効にすると、サイズの違いが10,205,184と10,205,696に変わることがわかりました。したがって、非/DEBUGビルドは同じサイズのままでしたが、/DEBUGビルドは512バイト大きくなりました(これは、.pdbへのポインターによって説明できます-おそらくリンカーはいくつかの倍数に丸められます512か何かの)。 1%未満の増加。どうやら、/DEBUGを追加すると、/OPT:REFも指定しない限り、リンカーは参照されていないオブジェクトを保持します。 (IDEの"Linker | Optimization | References"オプション)。

プログラムは.pdbファイルがなくても正常に実行されます。顧客サイトでより優れたデバッグエクスペリエンスを提供したい場合は、プログラムを顧客に送信することを選択できます。適切なスタックトレースを取得できるようにしたいだけの場合は、カスタマーマシンに.pdbファイルを用意する必要はありません。カスタマーマシン(または提供するツール/機能)は、ダンプファイルを送信して、にロードすることができます。利用可能な.pdbファイルを使用してサイトのデバッガーを実行し、同じスタックトレース情報をport-mortemで取得します。

もちろん、注意すべきことの1つは、リリースと一緒に.pdbファイルをアーカイブする必要があるということです。 「DebuggingToolsfor Windows」パッケージ(現在はWindows SDKで配布されています)は、.pdbファイルをアーカイブし、デバッグ用に簡単に取得できるシンボルサーバーツールを提供します。

.pdbファイルを配布することについて私が考えることができる唯一の欠点は、それが懸念事項である場合、アプリケーションのリバースエンジニアリングを容易にする可能性があることです。 Microsoftは、Windows用のシンボルを配布していることに注意してください(パブリックシンボルサーバーを使用し、特定のリリースの完全なシンボルセットのパッケージも使用します)。ただし、配布するシンボルは、機密性が高いと見なされる特定のアイテムを削除するサニタイズ手順を実行します。リンカの/PDBSTRIPPEDオプション(IDEでは"Linker | Debugging | Strip Private Symbols")を使用して、同じ(または同様の)ことを行うことができます。オプションが削除するものの詳細については、 MSDNドキュメント を参照してください。シンボルを配布する場合は、おそらくそのオプションを使用するのが適切です。

37
Michael Burr

Visual Studio 2005のドキュメントVisual Studio 2005の廃止されたドキュメントによると:

/ DEBUGは、/ OPTオプションのデフォルトをREFからNOREFに、およびICFからNOICFに変更します(したがって、/ OPT:REFまたは/ OPT:ICFを明示的に指定する必要があります)。

私の場合、両方を有効にすると役に立ちました。

/O2 /DEBUG /OPT:REF /OPT:ICF
2
orcy

使用している言語については言及していません。C++とC#では答えが異なる場合があります。

あなたがどのような変更を検討しているのか、100%わかりません。 Visual Studioに標準のデバッグコンパイルを作成して出荷するように指示しますか、それともリリースコンパイルでいくつかの設定を編集しますか?リリースビルドのいくつかの設定を注意深く変更することは、最善のアプローチだと思います。

最終的に何が起こっても、最適化がオンになっていることを確認します。これにより、コンパイルされたコードのパフォーマンスに大きな違いが生じる可能性があります。

1
David Yaw