日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

PDB文件格式

發(fā)布時(shí)間:2024/1/18 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PDB文件格式 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

PDB文件:每個(gè)開發(fā)人員都必須知道的
?
一 什么是PDB文件

大 部分的開發(fā)人員應(yīng)該都知道PDB文件是用來(lái)幫助軟件的調(diào)試的。但是他究竟是如何工作的呢,我們可能并不熟悉。本文描述了PDB文件的存儲(chǔ)和內(nèi)容。同時(shí)還描 述了debugger如何找到binay相應(yīng)的PDB文件,以及debugger如何找到與binay對(duì)應(yīng)的源代碼文件。本文適用于所有的Native和 Managed的開發(fā)人員。?

在開始前,我們先定義2個(gè)術(shù)語(yǔ):private build, 用來(lái)表示在開發(fā)人員自己機(jī)器上生成的build;public build,表示在公用的build機(jī)器上生成的build。private build相對(duì)來(lái)說(shuō)比較簡(jiǎn)單,因?yàn)镻DB和binay在相同的地方,通常地我們遇到的問(wèn)題都是關(guān)于public build。 ?
?
所有 的的開發(fā)人員需要知道的最重要的事情是”PDB文件跟源代碼同樣的重要“, 沒有PDB文件,你甚至不能debugging。對(duì)于public build,需要symbol server存儲(chǔ)所有的PDB,然后當(dāng)用戶報(bào)告錯(cuò)誤的時(shí)候,debugger才可以自動(dòng)地找到binay相應(yīng)的PDB文件, visual studio 和 windbg都知道如何訪問(wèn)symbol server。在將PDB和binay存儲(chǔ)到symbol server前,還需要對(duì)PDB運(yùn)行進(jìn)行source indexing, source indexing的作用是將PDB和source關(guān)聯(lián)起來(lái)。 ?
?
接下來(lái)的部分假設(shè)有已經(jīng)設(shè)置好了symbol server和source server indexing。TFS2010中可以很簡(jiǎn)單地完成對(duì)一個(gè)新的build的source indexing 和 symbol server copying。
?

二 PDB文件的內(nèi)容

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

三 PDB如何工作

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

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

完!

總結(jié)

以上是生活随笔為你收集整理的PDB文件格式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。