2008-09-09 7 views
7

ソースコードのない第三者コンポーネントを使用する必要があります。私はリリースDLLとリリースPDBファイルを持っています。それを 'CorporateComponent.dll'としましょう。自分のコードはこのDLLからオブジェクトを作成し、これらのオブジェクトのメソッドを呼び出します。デバッグ中にPDBが私に何を与え、どのように動作しているのか?

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

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

答えて

6

を(申し訳ありませんが、私は便利なのVisual Studioの現在のバージョンを持っていません) 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ビルドにシンボル情報を含めていない可能性があります。

4

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

0

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

5

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

2つの使用例を示します。最初は明らかな答えです。 2つ目はソース索引pdbの説明です。デバッガは手動でPDBを持っていないモジュールを使用してスタックをアンワインドするため

第一使用例...

大会とその使用コンパイラの最適化を呼び出すことによって、それができない場合があります。これは、特定のサードパーティのライブラリや、OSの一部の部分でさえも起こる可能性があります。

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

...

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

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

「どのように知っているのですか」という質問に答えるために、デバッガの「modules」機能は、どのモジュールに対応するpdbがあるかを示すことができます。 windbgでは "lml"コマンドを使います。ビジュアルスタジオでは、デバッグメニューのどこかからモジュールを選択します。あなたは、Visual Studio IDEのレビューの中に出力ウィンドウのデバッグ中に、提供さPDB、CorporateComponent.pdbを使用しているかどうかを確認し、行を検索するには

関連する問題