シンボル (.pdb) ファイル、ソース ファイル、およびバイナリ ファイルの検索
シンボル ファイルとソース ファイルを検索して指定する、シンボルの読み込み動作を指定する、シンボルとソース サーバーを使用する、シンボルを自動でまたは必要に応じて読み込む
目次
シンボル (.pdb) ファイルを検索する
[!メモ]
2012 以前のバージョンの Visual Studio では、リモート デバイス上でマネージ コードをデバッグするには、リモート コンピューター上にシンボル ファイルがあることが必要でした。このリリースでは、そのような作業が不要になりました。すべてのシンボル ファイルはローカル コンピューター上に配置するか、Visual Studio の [オプション] ダイアログ ボックスの [デバッグ]/[シンボル] ページで指定した場所に配置する必要があります。詳細については、Microsoft アプリケーション ライフサイクル ブログにある「Visual Studio 2012 および 2013 における .NET のリモート シンボル読み込みの変更」を参照してください。
- Where the debugger searches for .pdb files | Why do symbol files need to exactly match the executable files? | Specify symbol locations and loading behavior | Use symbol servers to find symbol files not on your local machine | Find and load symbols while debugging | Set compiler options for symbol files
プログラム データベース (.pdb) ファイルは、シンボル ファイルとも呼ばれ、クラス、メソッド、およびその他のコードのソース ファイルで作成した識別子を、プロジェクトのコンパイルされた実行可能ファイルで使用される識別子に対応付けます。また .pdb ファイルは、ソース コード内のステートメントを実行可能ファイル内の実行命令に対応付けます。デバッガーはこの情報を使用して 2 つの重要な情報を決定します。1 つは、Visual Studio IDE に表示されるソース ファイルと行番号です。もう 1 つは、設定されたブレークポイントによって実行可能ファイル内で停止する位置です。また、シンボル ファイルにはソース ファイルの元の場所、および必要に応じてソース ファイルを取得できるソース サーバーの場所が格納されています。
Visual Studio IDE でプロジェクトをデバッグするとき、デバッガーにはコードの .pdb とソース ファイルを検索する正確な場所が通知されます。プロジェクト ソース コードの外部コード (プロジェクトから呼び出す Windows やサード パーティのコードなど) をデバッグする場合、.pdb の場所 (必要に応じて外部コードのソース ファイル) を指定する必要があります。また、それらのファイルは実行可能ファイルのビルドに正確に対応付けられる必要があります。
デバッガーが .pdb ファイルを検索する場所
DLL または実行可能ファイル内で指定されている場所。
(DLL または実行可能ファイルをコンピューター上でビルドした場合、既定では、リンカーは DLL または実行可能ファイル内で対応付けられた .pdb ファイルの完全なパスとファイル名を特定します。デバッガーはまず、DLL または実行可能ファイル内で指定された場所にシンボル ファイルが存在するかどうかをチェックします。これが便利なのは、コンピューター上でコンパイルしたコードでシンボルが常に使用できるためです。)
DLL または実行可能ファイルと同じフォルダー内に存在する可能性がある .pdb ファイル。
任意のローカル シンボル キャッシュ フォルダー。
任意のネットワーク、インターネット、またはローカル シンボル サーバー、さらに指定された場所 (有効になっている場合は Microsoft シンボル サーバーなど)。
Find symbol (.pdb) files
Contents
シンボル ファイルを実行可能ファイルに正確に対応付ける必要がある理由
デバッガーは、実行可能ファイルがビルドされたときに作成された .pdb ファイルと正確に一致する実行可能ファイルの .pdb ファイルのみ読み込みます (つまり .pdb ファイルはオリジナルまたはオリジナルのコピーであることが必要)。コンパイラがコンパイル速度だけでなく、正確で効率的なコードを作成する主要なタスクに対しても最適化されるため、コード自体が変更されていない場合でも、実行可能ファイルの実際のレイアウトが変更されることがあります。詳細については、MSDN ブログの投稿「Why does Visual Studio require debugger symbol files to *exactly* match the binary files that they were built with? (Visual Studio においてデバッガー シンボル ファイルがビルド時のバイナリ ファイルと "正確に" 一致することが求められる理由)」を参照してください。
Find symbol (.pdb) files
Contents
シンボルの場所と読み込み動作を指定する
VS IDE でプロジェクトをデバッグするとき、デバッガーは、プロジェクト ディレクトリに格納されているシンボル ファイルを自動的に読み込みます。VS の [オプション] ダイアログ ボックスの [デバッグ]/[シンボル] ページで、Microsoft、Windows、またはサード パーティのコンポーネント用に別の検索パスとシンボル サーバーを指定できます。[シンボル] ページでは、デバッガーがシンボルを自動的に読み込む特定のモジュールを指定することもできます。これらの設定はデバッグ中に手動でも変更できます。
[デバッグ]/[シンボル] ページを開くには
[デバッグ] メニューの [オプション] をクリックします。
[オプション] ダイアログ ボックスで、[デバッグ] ノードの下の [シンボル] をクリックします。
シンボル サーバーまたは検索場所を指定する
フォルダー アイコンをクリックします。編集可能なテキストが [シンボル ファイル (.pdb) の場所] ボックスに表示されます。
シンボル サーバーまたはシンボルの場所の URL またはディレクトリ パスを入力します。ステートメント入力候補により、正しい形式を確認できます。
シンボルの読み込みパフォーマンスを向上させるには、シンボル サーバーによってシンボルをコピー可能なローカル ディレクトリのパスを [このディレクトリにシンボルをキャッシュ] に入力します。
[!メモ]
Windows フォルダーなどの保護されたフォルダー (C:\Windows フォルダーまたはそのいずれかのサブフォルダーなど) にシンボル キャッシュを配置しないでください。読み取り/書き込みフォルダーを使用してください。
シンボルの読み込み動作を指定する
デバッグの開始時に [シンボル ファイル (.pdb) の場所] ボックスに指定された場所から自動的に読み込まれるファイルを指定できます。プロジェクト ディレクトリ内のシンボル ファイルは常に読み込まれます。
[除外されていないすべてのモジュール] を選択すると、[除外されるモジュールの指定] リンクをクリックして指定したモジュール以外のすべてのモジュールのすべてのシンボルが読み込まれます。
[指定したモジュールのみ] オプションを選択して [モジュールの指定] をクリックすると、シンボル ファイルが自動的に読み込まれるモジュールを指定できます。その他のモジュールのシンボル ファイルは無視されます。
その他のシンボル オプションを指定する
VS の [オプション] ダイアログ ボックスの [デバッグ]/[全般] ページで次のオプションも設定できます。
[起動時にシンボルが見つからないとき警告 (ネイティブのみ)]
オンにすると、プログラムをデバッグするときにそのプログラムのシンボル情報がない場合は、警告を示すダイアログ ボックスが表示されます。
[DLL エクスポートを読み込む]
オンにすると、DLL エクスポート テーブルを読み込みます。DLL エクスポート テーブルのシンボル情報は、対応するシンボルのない Windows メッセージ、Windows プロシージャ (WindowProc)、COM オブジェクト、マーシャリング、または DLL を操作する場合に役立ちます。DLL エクスポート情報を読み取ると、オーバーヘッドがある程度発生します。そのため、既定ではこの機能はオフになっています。
DLL のエクスポート テーブル内で使用できるシンボルを調べるには、dumpbin /exports を使用します。シンボルは、任意の 32 ビット システムの DLL に使用できます。dumpbin /exports の出力を参照すると、英数字以外の文字を含む、正確な関数名を確認できます。この情報は、関数にブレークポイントを設定するときに使用します。DLL エクスポート テーブルの関数名は、デバッガーの他の場所で表示されるときは、切り捨てられることがあります。関数は呼び出し順に表示され、現在の関数 (入れ子の一番内側) が先頭に表示されます。詳細については、「dumpbin /exports」を参照してください。
Contents | Find symbol (.pdb) files
シンボル サーバーを使用してローカル コンピューター上にないシンボル ファイルを検索する
Visual Studio では、symsrv プロトコルを実装するシンボル サーバーからデバッグ シンボル ファイルをダウンロードできます。Visual Studio Team Foundation Server と Debugging Tools for Windows は、シンボル サーバーを実装できる 2 つのツールです。使用するシンボル サーバーは VS の [オプション] ダイアログ ボックスで指定します。
以下のシンボル サーバーを使用できます。
Microsoft パブリック シンボル サーバー
システム DLL やサードパーティのライブラリの呼び出し中に発生するクラッシュをデバッグするには、多くの場合、Windows DLL、EXE、およびデバイス ドライバー用のシンボルが格納されているシステム .pdb ファイルが必要です。これらのシンボルは Microsoft パブリック シンボル サーバーから取得できます。Microsoft パブリック シンボル サーバーは、MDAC、IIS、ISA、および .NET Framework のほか、Windows オペレーティング システムのシンボルを提供します。
Microsoft シンボル サーバーを使用するには、[デバッグ] メニューの [オプションと設定] をクリックし、[シンボル] をクリックします。[Microsoft シンボル サーバー] を選択します。
内部ネットワーク上またはローカル コンピューター上のシンボル サーバー
チームや会社で独自の製品用にシンボル サーバーを作成して、外部ソースのシンボルのキャッシュとして使用できます。自分のコンピューター上にシンボル サーバーを作成することもできます。VS の [オプション] ダイアログ ボックスの [デバッグ]/[シンボル] ページで URL またはパスとしてシンボル サーバーの場所を入力できます。
サード パーティのシンボル サーバー
Windows アプリケーションおよびライブラリのサード パーティ プロバイダーがインターネット上のシンボル サーバーへのアクセスを用意していることがあります。これらのシンボル サーバーの URL を [デバッグ]/[シンボル] ページで入力することもできます。
[!メモ]
Microsoft パブリック シンボル サーバー以外のシンボル サーバーを使用する場合は、シンボル サーバーとそのパスが信頼できることを確認してください。シンボル ファイルには任意の実行可能コードを含めることができるため、このファイルによりセキュリティ上の脅威にさらされる可能性があります。
Contents | Find symbol (.pdb) files
デバッグ中にシンボルを検索して読み込む
デバッガーが中断モードになっているときはいつでも、デバッガー オプションによって以前に除外されたモジュールのシンボル、またはコンパイラによって見つからなかったモジュールのシンボルを読み込むことができます。シンボルは [呼び出し履歴]、[モジュール]、[ローカル]、[自動変数]、[ウォッチ] のウィンドウのショートカット メニューから読み込むことができます。シンボルやソース ファイルが使用できないコードでデバッガーが実行を中断した場合、ドキュメント ウィンドウが表示されます。このウィンドウで、不足しているファイルに関する情報を検索し、それらのファイルを特定して読み込むための操作を実行できます。
[シンボルが読み込まれていません] ドキュメント ページでシンボルを検索する
シンボルを使用できないコードでデバッガーが実行を中断するようにするには、多くの方法があります。
コードにステップ インする。
ブレークポイントまたは例外でコードを中断する。
別のスレッドに切り替える。
[呼び出し履歴] ウィンドウのスタック フレームをダブルクリックして、スタック フレームを変更する。
これらのイベントのいずれかが発生すると、デバッガーによって [シンボルが読み込まれていません] ページが表示されて、このページから必要なシンボルを検索して読み込むことができます。
検索パスを変更するには、選択されていないパスを選択するか、[新規作成] を選択して新しいパスを入力します。[読み込み] をクリックしてパスを再び検索し、見つかった場合はシンボル ファイルが読み込まれます。
シンボル オプションをすべてオーバーライドして検索パスを再び試すには、[executable-name を参照して探す...] を選択します。シンボル ファイルが見つかった場合は読み込まれるか、ファイル エクスプローラーが表示されて手動でシンボル ファイルを選択できます。
[シンボルの設定の変更] を選択すると、VS の [オプション] ダイアログ ボックスの [デバッグ]/[シンボル] ページが表示されます。
[逆アセンブルの表示] を選択すると、逆アセンブルが新しいウィンドウに一度に表示されます。
ソースまたはシンボル ファイルが見つからないときに逆アセンブルが常に表示されるようにするには、[[オプション] ダイアログ ボックス] リンクをクリックし、[アドレス レベルのデバッグを有効にする] と [ソースがない場合は逆アセンブリの表示] の両方をオンにします。
ショートカット メニューからシンボル オプションを変更する
中断モードになっている状態で、[呼び出し履歴]、[モジュール]、[ローカル]、[自動変数]、[ウォッチ] のウィンドウに表示されている項目のシンボルを検索して読み込むことができます。ウィンドウで項目を選択し、ショートカット メニューを開いて、次のいずれかのオプションを選択します。
オプション |
説明 |
---|---|
シンボルの読み込み |
[オプション] ダイアログ ボックスの [デバッグ]/[シンボル] ページで指定した場所からシンボルを読み込もうとします。シンボル ファイルが見つからない場合は、ファイル エクスプローラーが起動され、検索する新しい場所を指定できるようになります。 |
[シンボルの読み込み情報] |
読み込まれたシンボル ファイルの場所、またはデバッガーがファイルを見つけることができない場合は検索した場所を示す情報が表示されます。 |
シンボルの設定... |
VS の [オプション] ダイアログ ボックスの [デバッグ]/[シンボル] ページが開きます。 |
常に自動的に読み込む |
デバッガーによって自動的に読み込まれるファイルの一覧にシンボル ファイルを追加します。 |
Contents | Find symbol (.pdb) files
シンボル ファイルのコンパイラ オプションを設定する
VS IDE からプロジェクトをビルドし、標準の [デバッグ] ビルド構成を使用すると、C++ およびマネージ コンパイラによってコードの適切なシンボル ファイルが作成されます。コマンド ラインでコンパイラ オプションを設定しても、シンボル ファイルを作成できます。
C++ のオプション
プログラム データベース (.pdb) ファイルは、デバッグとプロジェクト状態情報を保持します。この情報により、プログラムのデバッグ構成のインクリメンタル リンクが可能になります。/ZI または /Zi (C/C++ 用) を使用して構築すると、.pdb ファイルが作成されます。
Visual C++ では、コンパイラにより作成される .pdb ファイルを /Fd オプションで指定します。Visual Studio でウィザードを使ってプロジェクトを作成する場合は、/Fd オプションが project.pdb という名前の .pdb ファイルを作成するように設定されます。
メイクファイルを使って C/C++ アプリケーションをビルドするときに、/ZI または /Zi を指定して /Fd を指定しない場合は、次の 2 つの .pdb ファイルが作成されます。
VCx.pdb。x は Visual C++ のバージョン (VC11.pdb など) を表します。このファイルには、個別の OBJ ファイルのあらゆるデバッグ情報が格納されます。このファイルは、プロジェクトのメイクファイルと同じディレクトリに配置されます。
project.pdb。このファイルには、.exe ファイルのあらゆるデバッグ情報が格納されます。C/C++ の場合は、\debug サブディレクトリに配置されます。
OBJ ファイルが作成されるたびに、C/C++ コンパイラはデバッグ情報を VCx.pdb に挿入します。挿入される情報には、型情報が含まれますが、関数定義などのシンボル情報は含まれません。このため、ソース ファイルごとに <windows.h> などの共通ヘッダー ファイルをインクルードしているとしても、共通ヘッダー ファイルの typedef は一度格納されるだけで、OBJ ファイルごとに格納されるわけではありません。
リンカーは project.pdb を作成します。このファイルには、プロジェクトの EXE ファイルのデバッグ情報が格納されます。project.pdb ファイルには、VCx.pdb に含まれる型情報だけでなく、関数プロトタイプをはじめとするあらゆるデバッグ情報が格納されます。どちらの .pdb ファイルもインクリメンタル更新が可能です。またリンカーも、作成する .exe ファイルや .dll ファイルに .pdb ファイルへのパスを埋め込みます。
Visual Studio デバッガーでは、EXE ファイルまたは DLL ファイルの .pdb ファイルへのパスを使用して、project.pdb ファイルを検索します。指定された場所に .pdb ファイルが見つからないか、(プロジェクトが別のコンピューターに移動されたなど) パスが無効である場合は、EXE ファイルが格納されているパスを検索します。このパスは、[オプション] ダイアログ ボックス ([デバッグ] フォルダー/[シンボル] ノード) で指定されたシンボル パスです。デバッガーはデバッグ対象の実行可能ファイルに対応付けられている .pdb ファイルのみ読み込みます。デバッガーで .pdb ファイルが見つからない場合、[シンボル検索] ダイアログ ボックスが表示されます。このダイアログ ボックスで、シンボルを検索したり、検索パスに新しい場所を追加したりできます。
.NET Framework のオプション
プログラム データベース (.pdb) ファイルは、デバッグとプロジェクト状態情報を保持します。この情報により、プログラムのデバッグ構成のインクリメンタル リンクが可能になります。.pdb ファイルは、/debug でビルドすると作成されます。アプリケーションは、/debug:full または /debug:pdbonly でビルドできます。/debug:full でビルドすると、デバッグできるコードが生成されます。/debug:pdbonly でビルドすると .pdb ファイルは生成されますが、JIT コンパイラにデバッグ情報が使用できることを示す DebuggableAttribute は生成されません。デバッグが必要ないリリース ビルドで .pdb ファイルを生成する場合は /debug:pdbonly を使用します。詳細については、「/debug (C# コンパイラ オプション)」または「/debug (Visual Basic)」を参照してください。
Visual Studio デバッガーでは、EXE ファイルまたは DLL ファイルの .pdb ファイルへのパスを使用して、project.pdb ファイルを検索します。その場所に .pdb ファイルが見つからない場合、またはパスが無効な場合は、EXE ファイルが格納されているパスを検索した後に、[オプション] ダイアログ ボックスで指定されたシンボル パスを検索します。通常、このパスは シンボル ノードの デバッグ フォルダーです。デバッガーはデバッグ対象の実行可能ファイルに対応付けられている .pdb ファイルのみ読み込みます。デバッガーで .pdb ファイルが見つからない場合、[シンボル検索] ダイアログ ボックスが表示されます。このダイアログ ボックスで、シンボルを検索したり、検索パスに新しい場所を追加したりできます。
Web アプリケーション
アプリケーションの構成ファイル (Web.config) をデバッグ モードに設定する必要があります。デバッグ モードの ASP.NET では、動的に生成されたファイル用のシンボルが生成され、デバッガーの ASP.NET アプリケーションへのアタッチが可能になります。VS では、プロジェクトを Web プロジェクト テンプレートから作成した場合は、デバッグ開始時にこの処理が自動的に実行されます。
Contents | Find symbol (.pdb) files
ソース ファイルを検索する
- Where the debugger searches for source files | Find and load source files with the No Source / No Symbols Loaded pages | Add source file search paths to a solution | Use source servers
デバッガーがソース ファイルを検索する場所
デバッガーは次の場所でソース ファイルを検索します。
デバッガーを起動した Visual Studio インスタンスの IDE で開いているファイル。
VS インスタンスで開いているソリューション内のファイル。
ソリューションのプロパティの [共通プロパティ]/[デバッグ ソース ファイル] ページで指定したディレクトリ。
モジュールの .pdb のソース情報。場合によって、モジュールがビルドされたソース ファイルの場所またはソース サーバーへのコマンドです。
Contents | Find source files
[ソースが読み込まれていません] または [シンボルが読み込まれていません] ページでソース ファイルを検索して読み込む
ソース ファイルを使用できない場所でデバッガーが実行を中断した場合、[ソースが読み込まれていません] または [シンボルが読み込まれていません] ページが表示されます。[シンボルが読み込まれていません] が表示されたときは、デバッガーは実行可能ファイルのシンボル (.pdb) ファイルを見つけることができず、その検索を完了できません。[シンボルが読み込まれていません] には、ファイルを検索するオプションが表示されています。いずれかのオプションを実行した後、.pdb が見つかり、デバッガーがシンボル ファイル内の情報を使用してソース ファイルを取得できた場合は、ソースが表示されます。それ以外の場合、[ソースが読み込まれていません] ページが表示され、問題が説明されます。このページには、問題解決のための操作を実行できるオプションのリンクが表示されています。
Contents | Find source files
ソース ファイルの検索パスをソリューションに追加する
ソース ファイルを検索するネットワークまたはローカルのディレクトリを指定できます。
ソリューション エクスプローラーでソリューションを選択し、ショートカット メニューの [プロパティ] をクリックします。
[共通プロパティ] ノードの下の [デバッグ ソース ファイル] をクリックします。
フォルダー アイコンをクリックします。編集可能なテキストが [ソース コードを含んでいるディレクトリ] ボックスの一覧に表示されます。
検索するパスを追加します。
指定したディレクトリのみ検索されることに注意してください。検索するすべてのサブディレクトリのエントリを追加する必要があります。
Contents | Find source files
ソース サーバーを使用する
ローカル コンピューターにソース コードがない場合、または .pdb ファイルがソース コードと一致しない場合、ソース サーバーを使用して、アプリケーションのデバッグに役立てることができます。ソース サーバーは、ファイルの要求を受け取り、実際のファイルを返します。ソース サーバーは、srcsrv.dll という名前の DLL ファイルを使用して実行されます。ソース サーバーでは、ソース コードのレポジトリへのポインターを含むアプリケーションの .pdb ファイルだけでなく、レポジトリからソース コードを取得するときに使用するコマンドも読み取ります。アプリケーションの .pdb ファイルから実行できるコマンドは、制限できます。この場合、srcsrv.ini というファイルに許可するコマンドを列挙し、srcsrv.dll および devenv.exe と同じディレクトリに配置します。
セキュリティに関するメモ |
---|
アプリケーションの .pdb ファイルには任意のコマンドを埋め込むことができるため、srcsrv.ini ファイルには実行するコマンドのみ配置するようにします。srcsvr.ini ファイルにないコマンドを実行しようとすると、確認のダイアログ ボックスが表示されます。詳細については、「セキュリティ警告 : デバッガーは信頼されないコマンドを実行する必要があります」を参照してください。コマンド パラメーターでは何も検証されないため、コマンドを信頼するときは注意してください。たとえば、cmd.exe を信頼した場合、悪意のあるユーザーが危険な動作を実行するようにコマンドにパラメーターを指定する可能性があります。 |
ソース サーバーの使用を有効にするには
前のセクションで説明したセキュリティ手法で、コンパイルを完了します。
[ツール] メニューの [オプション] をクリックします。
[オプション] ダイアログ ボックスが表示されます。
[デバッグ] ノードで、[全般] を選択します。
[ソース サーバー サポートを有効にする] チェック ボックスをオンにします。
(省略可能) 必要な子オプションを選択します。
[部分信頼アセンブリのソース サーバーを許可する (マネージのみ)] と [信頼されていないソース サーバー コマンドを常に確認なしで実行する] のいずれを選択した場合も、前述のセキュリティ リスクが高くなる可能性があることに注意してください。
Contents | Find source files