デバッグ中に PDB から何が得られますか?また、PDB が機能していることをどのように確認できますか?

StackOverflow https://stackoverflow.com/questions/52600

  •  09-06-2019
  •  | 
  •  

質問

ソースコードのないサードパーティコンポーネントを使用する必要があります。リリース DLL とリリース PDB ファイルがあります。これを「CorporateComponent.dll」と呼びます。私自身のコードは、この DLL からオブジェクトを作成し、これらのオブジェクトのメソッドを呼び出します。

CorpObject o = new CorpObject();
Int32 result = o.DoSomethingLousy();

デバッグ中に、メソッド 'DoSomethingLousy' が例外をスローします。PDB ファイルは何をするのですか?それが何か良いことをするなら、どうすればそれを利用していることを確認できるでしょうか?

役に立ちましたか?

解決

Visual Studio IDE 内でのデバッグ中に、提供された PDB CorporateComponent.pdb を使用しているかどうかを確認するには、出力ウィンドウを確認し、CorporateComponent.dll がロードされていることを示す行とその後に続く文字列を見つけます。 Symbols loaded.

私のプロジェクトから説明すると、次のようになります。

The thread 0x6a0 has exited with code 0 (0x0).
The thread 0x1f78 has exited with code 0 (0x0).
'AvayaConfigurationService.vshost.exe' (Managed): Loaded 'C:\Development\Src\trunk\ntity\AvayaConfigurationService\AvayaConfigurationService\bin\Debug  \AvayaConfigurationService.exe', Symbols loaded.
'AvayaConfigurationService.vshost.exe' (Managed): Loaded 'C:\Development\Src\trunk\ntity\AvayaConfigurationService\AvayaConfigurationService\bin\Debug\IPOConfigService.dll', No symbols loaded.

Loaded 'C:\Development\src...\bin\Debug\AvayaConfigurationService.exe', Symbols loaded.

これは、PDB が IDE デバッガーによって検出され、ロードされたことを示します。

他の人が指摘したように、アプリケーション内のスタック フレームを調べると、CorporateComponent.pdb のシンボルを確認できるはずです。そうでない場合は、サードパーティがリリース PDB ビルドにシンボル情報を含めていない可能性があります。

他のヒント

pdb には、デバッガがスタックを正しく読み取るために必要な情報が含まれています。スタック トレースには、pdb があるモジュール内のスタック フレームの行番号とシンボル名が含まれます。

2つの使用例を紹介します。1つ目は明白な答えです。2 番目のセクションでは、ソースインデックス付きの PDB について説明します。

使用例1つ目は…

呼び出し規約とコンパイラーが使用した最適化によっては、pdb がないモジュールを介してデバッガーが手動でスタックをアンワインドできない場合があります。これは、特定のサードパーティ ライブラリや、OS の一部で発生する可能性があります。

Windows OS 内でアクセス違反が発生したシナリオを考えてみましょう。OS コンポーネントはデバッガーを混乱させる特別な呼び出し規則を使用しているため、スタック トレースは独自のアプリケーションに展開されません。パブリック OS PDB をダウンロードするようにシンボル パスを構成すると、スタック トレースがアプリケーションに巻き戻される可能性が高くなります。これにより、独自のコードが OS システム コールに渡した引数を正確に確認できるようになります。(サードパーティのライブラリ内、または独自のコード内の AV の同様の例も)

使用例2つ目は・・・

Pdb にはもう 1 つの非常に便利な特性があります。Microsoft が「ソース インデックス作成」と呼ぶ機能を使用して、一部のソース管理システムと統合できます。ソース インデックス付き PDB には、コンポーネントのビルドに使用された正確なファイル バージョンをソース管理からフェッチする方法を指定するソース管理コマンドが含まれています。Microsoft のデバッガは、デバッグ セッション中にファイルを自動的にフェッチするコマンドの実行方法を理解しています。これは、デバッグ技術者が特定のビルドの正しいラベルにソース ツリーを手動で同期する手間を省く強力な機能です。これは、リモート デバッグ セッションや事後クラッシュ ダンプの分析に特に役立ちます。

「Windows 用デバッグ ツール」インストール (windbg) には、srcsrv.doc という名前のドキュメントが含まれています。このドキュメントには、srctool.exe を使用して、特定の PDB 内でどのソース ファイルにソース インデックスが付けられているかを判断する方法を示す例が含まれています。

「どうすればわかるのか」という質問に答えるために、デバッガーの「モジュール」機能を使用すると、どのモジュールに対応する pdb があるかを知ることができます。Windbg では「lml」コマンドを使用します。Visual Studio では、デバッグ メニューのどこかからモジュールを選択します。(申し訳ありませんが、手元に Visual Studio の最新バージョンがありません)

PDB は命令を元のコードの行番号にマップするデータベース ファイルであるため、スタック トレースを取得するとコードの行番号が得られます。アンマネージ DLL の場合、PDB ファイルにはスタック トレース内の関数の名前も表示されますが、その情報は通常、PDB のないマネージ DLL でのみ利用可能です。

PDB から取得する主なものは、スタック トレースの行番号と実際のメソッド名です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top