您現在的位置: 365建站網 > 365學習 > pdb文件是什么 怎么打開詳解

pdb文件是什么 怎么打開詳解

文章來源:365jz.com     點擊數:4788    更新時間:2018-10-26 08:58   參與評論

PDB文件的介紹

PDB(Program Data Base),意即程序的基本數據,是VS編譯鏈接時生成的文件。DPB文件主要存儲了VS調試程序時所需要的基本信息,主要包括源文件名、變量名、函數名、FPO(幀指針)、對應的行號等等。因為存儲的是調試信息,所以一般情況下PDB文件是在Debug模式下才會生成。


PDB文件的調用過程

模塊(Module),EXE和DLL都可以稱之為模塊,因為它們都有自已獨立的Stack,所以我們在調試程序時,可以在Call Stack窗口查看到所有調用的Module Name。并且可以右鍵查看相應模塊的ybmol Load Information,即該模塊調用的PDB文件路徑的過程。


每個模塊被載入的時候,其相同名字的PDB文件同時被載入。所以Debug模式下,不僅因為代碼沒有優化,同時因為要載入PDB文件,所以Debug模式下的程序執行速度非常慢。


每個模塊只會生成一個相同名字的PDB文件,并且模塊生成的同時,會校驗PDB文件生成GUID記錄在模塊內。這是因為調試時,調試器強制要求每個模塊必須和PDB文件保持一致。實驗過程中,用之前生成的PDB文件替換當前生成的PDB文件時,Debug窗口會顯示No symbols loaded. MSDN也做了相應的說明:The debugger will load only a PDB for a binary that exactly matches the PDB that was created when the binary was built.


PDB文件中記錄了源文件路徑的相關信息,所以在載入PDB文件的時候,就可以將相關調試信息與源碼對應。這樣可以可視化的實時查看調試時的函數調用、變量值等相關信息。模塊當中記錄的PDB文件是絕對路徑。所以只要模塊在當前電腦上載入,調試器自然地會根據模塊當中的路徑信息找到相應PDB文件并載入。同樣PDB文件中記錄的源文件路徑也是絕對路徑,所以PDB文件只要在當前電腦上載入,調試進入相應模塊時,都能夠匹配到記錄的源文件,然后可視化地查看相應信息。


.pdb文件,是VS生成的用于調試的符號文件(program database),保存著調試的信息。在VS的工程屬性,C/C++,調試信息格式,設置/Zi,那么VS就會在構建項目時創建PDB文件。

在這里要區分兩種情況:

1、構建靜態庫時,可以在工程屬性 –> C/C++ –> 輸出文件 –> 程序數據庫名 設置生成的pdb文件名稱,如果不指定,默認是生成為VCx0.pdb,這里x是VS版本號,例如用VS2005,就會生成VC80.pdb。這里就會產生一個疑問,編譯靜態庫時默認生成的.pdb文件名字都一樣,那引用這個靜態庫的項目最后能找到正確的.pdb文件嗎?答案是肯定的,因為VS會在生成的文件中嵌入 .pdb 文件的路徑。

舉個例子,在Project/ToolA下,構建了一個靜態庫ToolA.lib,對應生成一個vc80.pdb,同樣在在Project/ToolB下,構建了一個靜態庫ToolB.lib,對應生成一個vc80.pdb。然后最終的工程Work.exe同時鏈接了這兩個靜態庫.這時,生成Work.pdb的時候,就會在ToolA.lib中找到它對應的符號文件路徑Project/ToolA/vc80.pdb,以及ToolB.lib對應的符號文件路徑Project/ToolB/vc80.pdb,合并生成最終工程的Work.pdb。

 

2、構建可執行文件或動態庫,這種情況下,編譯器會生成一個.pdb文件,鏈接器會生成一個.pdb文件,編譯器生成的pdb文件可以在在工程屬性 –> C/C++ –> 輸出文件 –> 程序數據庫名 設置,鏈接器生成的.pdb文件可以在工程屬性 –> 鏈接器 –> 調試 –> 生成調試信息(設置Yes),生成程序數據庫名設置。

這兩個pdb文件有什么不一樣呢?編譯器生成的pdb文件,默認也是用vcx0命名,是編譯器在編譯過程中,把每個.obj文件對應的符號信息存儲在其中的,但不包括函數定義。而鏈接器生成的.pdb文件,默認使用工程名命名,是鏈接器在鏈接工程時,根據編譯器生成的vcx0.pdb再進一步加工出來的,具有完整信息的符號文件。就像鏈接器根據各個.obj文件生成exe或dll一樣,編譯器生成的.pdb文件是編譯-鏈接過程的中間產物,最后用于調試程序的是鏈接器生成的ProjectName.pdb.

上面說的是pdb文件生成規則。在使用的時候,調時期會取到文件對應的pdb文件路徑,然后去那個路徑(絕對路徑)下找,如果這個exe或者dll是自己編的,那無論它放在哪里,pdb文件只要不動,調試器都能找到它。如果調試器在那個路徑下找不到,就會到exe或者dll的同級目錄找。例如這個工程是別人編出來的,連同符號文件一起發過來,我們只要把符號文件與exe或者dll放在同級目錄,調試器也能找到它。當然,在調試器中也可以自己指定符號文件路徑。

這兩天糾結項目中各種靜態庫,動態庫,可執行文件的調試以及對應的符號文件,總算搞清楚pdb文件的生成以及使用規則,在此總結記錄一下。


PDB文件的內容

正式開始PDB的內容,PDB不是公開的文件格式,但是Microsoft提供了API來幫助從PDB中獲取數據。
 
Native C++ PDB包含了如下的信息:
 * public,private 和static函數地址;
 * 全局變量的名字和地址;
 * 參數和局部變量的名字和在堆棧的偏移量;
 * class,structure 和數據的類型定義;
 * Frame Pointer Omission 數據,用來在x86上的native堆棧的遍歷;
 * 源代碼文件的名字和行數;
 
.NET PDB只包含了2部分信息:
 * 源代碼文件名字和行數;
 * 和局部變量的名字;
 * 所有的其他的數據都已經包含在了.NET Metadata中了;  
 

PDB如何工作

當你加載一個模塊到進程的地址空間的時候,debugger用2中信息來找到相應的PDB文件。第一個毫無疑問就是文件的名字,如果加載 zzz.dll,debugger則查找zzz.pdb文件。在文件名字相同的情況下debugger還通過嵌入到PDB和binay的GUID來確保 PDB和binay的真正的匹配。 所以即使沒有任何的代碼修改,昨天的binay和今天的PDB是不能匹配的??梢允褂胐empbin.exe來查看binary的GUID。 
 
在VisualStudio中的modules窗口的symbol file列可以查看PDB的load順序。第一個搜索的路徑是binary所在的路徑,如果不在binary所在的路徑,則查找binary中hardcode記錄的build目錄,例如obj\debug\*.pdb, 如果以上兩個路徑都沒有找到PDB,則根據symbol server的設置,在本地的symbol server的cache中查找,如果在本地的symbol server的cache中沒有對應的PDB,則最后才到遠程的symbol server中查找。通過上面的查找順序我們可以看出為什么public build和private build的PDB查找不會沖突。 
 
對于private build有時我們需要在別人的機器上debug的情況,需要將相應的PDB與binary一起拷貝,對于加入GAC的.NET的binary,需要將PDB文件拷貝到C:\Windows\assembly\GAC_MSIL\Example\1.0.0.0__682bc775ff82796a類似的binary所在的目錄。另一個變通的方法是定義環境變量DEVPATH,從而代替使用命令GACUTIL將binary放入GAC中。在定義DEVPATH后,只需要將binary和PDB放到DEVPATH的路徑,在DEVPATH下的binary相當于在GAC下。使用DEVPATH,首先需要創建目錄且對當前build用戶有寫權限,然后創建環境變量DEVPATH且值為剛才創建的目錄,然后在web.config,app.config或machine.config中開啟development模式,啟動對DEVPATH的使用 
<configuration
   <runtime
      <developmentMode developerInstallation="true"/> 
   </runtime
</configuration

在你打開了development模式后,如果DEVPATH沒有定義或路徑不存在的話會導致程序啟動時異常"Invalid value for registry"。而且如果在machine.config中開啟DEVPATH的使用會影響其他的所有的程序,所以要慎重使用machine.config。 
 
最后開發人員需要知道的是源代碼信息是如何存儲在PDB文件中的。對于public builds,在運行source indexing tool后,版本控制工具將代碼存儲到你設置的代碼cache中。對于private builds,只是存儲了PDB文件的全路徑,例如在c:\foo下的源文件mycode.cpp,在pdb文件中存儲的路徑為c:\foo\mycode.cpp。對于private builds可以使用虛擬盤來增加PDB對絕對路徑的依賴,例如可以使用subst.exe將源代碼路徑掛載為V:,在別人的機器上debug的時候也掛載V:。


如對本文有疑問,請提交到交流論壇,廣大熱心網友會為你解答??! 點擊進入論壇

您可能感興趣的文章:


發表評論 (4788人查看,0條評論)
請自覺遵守互聯網相關的政策法規,嚴禁發布色情、暴力、反動的言論。
用戶名: 驗證碼: 點擊我更換圖片
最新評論
------分隔線----------------------------
自拍偷拍福力视频,偷拍国际精品,麻豆一区福利电影,国产网红视频午夜福利,se视频大全,久久国产AV影院 成人纯肉动漫在线播放| 一级做人爱c视频正版免费| 女人裸体| 热の国产热の中文在线二区| 免费无遮挡无码视频在线影院| 男女激情爽爽爽免费视频| janpanese熟女丰满| 如狼似虎的熟妇14p| 好妈妈8电影免费观看完整版| 免费av在线看不卡| japanese日本丰满少妇| 抖音奶片故意走漏视频7028| 脱了胸罩让男人吃奶头| 2012年中文字幕在线| 特级婬片女子高清视频| 美女网站免费福利视频| 在线观看未18禁免费视频| 色综合av社区男人的天堂| 欧美人与动牲交另类| 日本人妻巨大乳挤奶水| 青春娱乐视频在线播放| 国产一卡二卡三卡四卡免费| 苏若雪沈浪全文免费阅读| 色五月播五月丁香综合| 少妇高潮太爽了在线播放| 日日噜噜夜夜狠狠视频免费| 欧美性性性性o00xx| 亚洲人jizz日本人| 全家大杂乱| 五月天婷婷激情无码专区| 日本真人无遮挡啪啪免费| http://www.online-conference-call.com