2008-09-09 52 views
7

我必須使用沒有源代碼的第三方組件。我有發佈DLL並釋放PDB文件。我們稱之爲'CorporateComponent.dll'。我自己的代碼從這個DLL創建對象並調用這些對象的方法。調試時PDB給我帶來了什麼,我如何知道它在工作?

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

調試時,方法'DoSomethingLousy'將引發異常。什麼PDB文件爲我做?如果它做得很好,我怎麼能確定我正在使用它?

回答

6

要確認在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版本中包含符號信息。

4

的PDB是說明映射到它們的行號在原來的代碼,這樣,當你得到一個堆棧跟蹤,你會得到的代碼行號碼的數據庫文件。如果它是一個非託管DLL,那麼PDB文件也會爲您提供堆棧跟蹤中函數的名稱,而該信息通常僅適用於沒有PDB的託管DLL。

0

我從pdb獲得的主要是堆棧跟蹤的行號和實際方法名稱。

5

pdb包含調試器爲了正確讀取堆棧所需的信息。您的堆棧跟蹤將包含您擁有該pdb的模塊內的堆棧幀的行號和符號名稱。

我給兩個用法的例子。第一個是明顯的答案。第二個解釋了源代碼索引的pdb。

1日使用例子...

根據調用約定並優化使用的編譯器,它可能無法調試器手動通過對你沒有PDB模塊展開堆棧。這可能會發生在某些第三方庫,甚至操作系統的某些部分。

考慮在Windows操作系統內遇到訪問衝突的情況。堆棧跟蹤不會放到您自己的應用程序中,因爲該OS組件使用特殊的調用約定來混淆調試器。如果您將符號路徑配置爲下載公共操作系統pdb,那麼很有可能堆棧跟蹤將放到您的應用程序中。這使您能夠準確查看自己的代碼傳遞給OS系統調用的參數。 (以及類似的例子爲第三方庫的內部,甚至裏面的自己的代碼AV)

第二個用法示例...

PDB的還有一個非常有用的性質 - 它們可以使用一些源代碼控制系統集成微軟稱之爲「源索引」的功能。源代碼索引的pdb包含源代碼控制命令,用於指定如何從源代碼控制中獲取用於構建組件的確切文件版本。微軟的調試器瞭解如何執行命令以在調試會話期間自動獲取文件。這是一個強大的功能,可以使調試機器人不必手動將源樹同步到給定構建的正確標籤。這對於遠程調試會話和分析事故後崩潰轉儲特別有用。

「windows的調試工具」安裝(windbg)包含一個名爲srcsrv.doc的文檔,它提供了一個演示如何使用srctool.exe來確定哪些源文件在給定的pdb中被源索引的示例的文檔。

要回答你的問題:「我怎麼知道」,在調試器中的「模塊」功能可以告訴你哪些模塊都有相應的PDB。在windbg中使用「lml」命令。在Visual Studio中,從調試菜單中的某個地方選擇模塊。(對不起,我沒有最新版本的visual studio)

相關問題