發(fā)布時(shí)間:2024-04-10 文章來源:深度系統(tǒng)下載 瀏覽:
pdb是什么文件格式?pdb文件有什么用?下面小編就給大家分享下什么是PDB格式文件。
PDB(Program DataBase),全稱為“程序數(shù)據(jù)庫”文件,是VS編譯鏈接時(shí)生成的文件。DPB文件主要存儲了VS調(diào)試程序時(shí)所需要的基本信息,主要包括源文件名、變量名、函數(shù)名、FPO(幀指針)、對應(yīng)的行號等等。因?yàn)榇鎯Φ氖钦{(diào)試信息,所以一般情況下PDB文件是在Debug模式下才會生成。 PDB文件中記錄了源文件路徑的相關(guān)信息,所以在載入PDB文件的時(shí)候,就可以將相關(guān)調(diào)試信息與源碼對應(yīng)。這樣可以可視化的實(shí)時(shí)查看調(diào)試時(shí)的函數(shù)調(diào)用、變量值等相關(guān)信息。模塊當(dāng)中記錄的PDB文件是絕對路徑。所以只要模塊在當(dāng)前電腦上載入,調(diào)試器自然地會根據(jù)模塊當(dāng)中的路徑信息找到相應(yīng)PDB文件并載入。同樣PDB文件中記錄的源文件路徑也是絕對路徑,所以PDB文件只要在當(dāng)前電腦上載入,調(diào)試進(jìn)入相應(yīng)模塊時(shí),都能夠匹配到記錄的源文件,然后可視化地查看相應(yīng)信息。 PDB文件什么時(shí)候產(chǎn)生?PDB文件是在我們編譯工程的時(shí)候產(chǎn)生的,它是和對應(yīng)的模塊(exe或dll)一起生成出來的。我們一般可能不會意識到PDB文件的重要性,因?yàn)槿绻皇俏覀儽镜剡M(jìn)行開發(fā),我們總是能夠進(jìn)行調(diào)適。這里我要引入兩個(gè)概念:Private Build和Public Build1。Private Build指的是在開發(fā)機(jī)器上的編譯,Public Build指的是在負(fù)責(zé)編譯的機(jī)器上的編譯。 正如上面我所說Private Build一般不會有問題,因?yàn)樵诰幾g出來的機(jī)器上進(jìn)行調(diào)試所有必要的文件都在該在的地方。所有大部分不能調(diào)試的問題都發(fā)生在Public Build的情況下。 如果你的應(yīng)用程序需要發(fā)布或者當(dāng)作產(chǎn)品賣得,你就需要特別注意要保存你發(fā)布出去的那個(gè)版本的PDB文件和源文件。 注意:你只有一次機(jī)會保存著發(fā)布出去的PDB文件,如果你弄丟了將無法找回。(原因下面說明)<當(dāng)然使用Reflector 類似的工具去調(diào)試也是可以的> 為什么PDB這么重要?也許你會認(rèn)為如果拿一份一模一樣的源代碼重新編譯一個(gè)PDB文件,然后用來調(diào)試就行了。我也曾經(jīng)這么認(rèn)為過,直到有一天…...... 直接的原因是因?yàn)閂S生成出來的二進(jìn)制文件的Header部分里面包含了它對應(yīng)的PDB的GUID,PDB也包含一個(gè)GUIID,這兩個(gè)GUID實(shí)在編譯的時(shí)候添加進(jìn)去的。VS調(diào)試器在載入PDB的時(shí)候會去比對這個(gè)兩個(gè)GUID,如果不一致,那么就不能使用。 當(dāng)然上面那個(gè)原因只是一個(gè)表面現(xiàn)象,根本原因是既是兩份一模一樣的代碼編譯器編譯出來的文件可能是不一樣的。因?yàn)榫幾g器在編譯的時(shí)候會對代碼進(jìn)行優(yōu)化,而同一份代碼可能會有很多種優(yōu)化的方法,它會根據(jù)當(dāng)時(shí)的具體機(jī)器的環(huán)境等情況選擇一個(gè)最快的生成方法。所以它生成出來的文件有可能是不一樣的!所以如果連生成出來的文件都不一樣,那么原來的那個(gè)PDB里面的符號對應(yīng)的地址也就沒有意義了。 如何查看二進(jìn)制文件和PDB的GUID?使用VS自帶的DUMPBIN工具可以查看二進(jìn)制文件所期望的PDB的GUID;居梅ň褪荄UMPBIN /HEADER 文件,具體用可可參考MSDN(http://msdn.microsoft.com/zh-cn/library/c1h23y6c(v=vs.80).aspx)。 查看PDB的GUID可以用下面這個(gè)工具,直接將PDB拉進(jìn)去即可。
PDB文件的查找策略先上試驗(yàn)結(jié)果,可以再調(diào)試的時(shí)候從Visual Studio 的Module串口中查找到一個(gè)module的symbol的查找策略。從截圖中我們可以看到結(jié)果如下:
1、文件被執(zhí)行或者被載入的地址 2、 就是硬編碼在PE文件頭中的那個(gè)地址。大家可以看到obj\<config>才是最原始生成的地址,只是之后被拷貝到了第一個(gè)地址中去了。 3、 如果配置了符號服務(wù)器,第二步以后應(yīng)該先去符號服務(wù)器的緩存目錄下找,如果找不到再去符號服務(wù)器上去找。找到的話就會下載到緩存目錄。 4、 第三部分是我VS中設(shè)置的一些符號查詢的目錄,因?yàn)槲已b過Reflector所以默認(rèn)加了這幾個(gè)目錄在我的設(shè)置中。 5、Windows文件夾。 這里有一個(gè)比較有意思的現(xiàn)象就是,VS的查找策略都是會先找一個(gè)目錄下的symbol\exe\project.pdb,然后exe\project.pdb,最后才找project.pdb。這個(gè)順序有點(diǎn)出人意料。 PDB文件會影響性能么?可能有些人會覺得PDB文件的生成會對最終的應(yīng)用程序的性能產(chǎn)生一定的影響,所以覺得在發(fā)布版中不應(yīng)該生成PDB文件。 錯(cuò)!對于.NET應(yīng)用程序來說,生成PDB文件不會影響編譯器的優(yōu)化,所以也完全不會影響應(yīng)用的性能。只會對于生成的程序集中的一個(gè)DebuggableAttribute的屬性產(chǎn)生影響。 擴(kuò)展知識:PDB文件是Palm OS操作系統(tǒng)上數(shù)據(jù)文件類型。一般在使用Palm系統(tǒng)的電子書時(shí)都會遇到這種文件,一般用于電子書或手機(jī)電子書 pdb是Palm DataBase的縮寫,Palm OS所用文件的擴(kuò)展名為“。pdb”。 PDB文件是在編譯工程的時(shí)候產(chǎn)生的,它是和對應(yīng)的模塊(exe或dll)一起生成出來的。pdb文件可以使用一些特有的pdb閱讀器打開。如果想把PDB文件轉(zhuǎn)換成TXT文件查看,可以使用專用轉(zhuǎn)換器轉(zhuǎn)換。 |