7

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

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

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

4

4 に答える 4

6

提供されたPDBであるCorporateComponent.pdbを使用しているかどうかを確認するには、Visual Studio IDE内でのデバッグ中に、出力ウィンドウを確認し、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ビルドにシンボル情報を含めていません。

于 2008-09-09T22:59:51.417 に答える
5

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

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

使用例その1…

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

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

使用例その2・・・

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

「Windows 用デバッグ ツール」インストール (windbg) には、srcsrv.doc という名前のドキュメントが含まれています。これは、srctool.exe を使用して、特定の pdb でソース インデックスが作成されているソース ファイルを特定する方法を示す例を提供します。

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

于 2008-09-09T19:34:06.793 に答える
4

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

于 2008-09-09T18:55:22.237 に答える
0

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

于 2008-09-09T18:56:11.457 に答える