首頁 後端開發 C#.Net教程 pdb是什麼檔案?

pdb是什麼檔案?

Jul 28, 2020 am 11:27 AM
.net

pdb是指「程式資料庫」文件,是VS編譯連結時產生的文件。 DPB檔案主要儲存了VS偵錯程式時所需的基本訊息,主要包括來源檔案名稱、變數名稱、函數名稱、FPO、對應的行號等等。 PDB檔案是在編譯工程的時候產生的,它是和對應的模組一起產生出來的。

pdb是什麼檔案?

本教學操作環境:windows7系統、Dell G3電腦。

PDB(Program DataBase),全稱為「程式資料庫」文件,是VS編譯連結時產生的檔案。 DPB檔案主要儲存了VS偵錯程式時所需的基本訊息,主要包括來源檔案名稱、變數名稱、函數名稱、FPO(幀指標)、對應的行號等等。因為儲存的是偵錯訊息,所以一般情況下PDB檔案是在Debug模式下才會產生。

PDB檔案中記錄了來源檔案路徑的相關訊息,所以在載入PDB檔案的時候,就可以將相關偵錯資訊與原始碼對應。這樣可以視覺化的即時查看偵錯時的函數呼叫、變數值等相關資訊。模組當中記錄的PDB檔案是絕對路徑。所以只要模組在目前電腦上載入,偵錯器自然會根據模組當中的路徑資訊找到對應PDB檔案並載入。同樣PDB檔案中記錄的來源檔案路徑也是絕對路徑,所以PDB檔案只要在目前電腦上載入,調試進入對應模組時,都能夠配對到記錄的來源文件,然後視覺化地檢視對應資訊。

PDB檔案什麼時候產生?

PDB檔案是在我們編譯工程的時候產生的,它是和對應的模組(exe或dll)一起產生出來的。我們一般可能不會意識到PDB文件的重要性,因為如果只是我們在本地進行開發,我們總是能夠進行調適。這裡我要介紹兩個概念:Private Build和Public Build1。 Private Build指的是開發機器上的編譯,Public Build指的是負責編譯的機器上的編譯。

正如上面我所說Private Build一般不會有問題,因為在編譯出來的機器上進行調試所有必要的文件都在該在的地方。所有大部分不能調試的問題都發生在Public Build的情況下。

如果你的應用程式需要發布或當作產品賣得,你就需要特別注意要保存你發佈出去的那個版本的PDB檔案和原始檔。注意:你只有一次機會保存發佈出去的PDB文件,如果你弄丟了將無法找回。 2(原因下面說明)

為什麼PDB這麼重要?

也許你會認為如果拿一份一模一樣的原始碼重新編譯一個PDB文件,然後用來調試就行了。我也曾經這麼認為過,直到有一天…......

直接的原因是因為VS生成出來的二進位檔案的Header部分裡麵包含了它對應的PDB的GUID,PDB也包含一個GUIID,這兩個GUID實在編譯的時候加進去的。 VS調試器在載入PDB的時候會去比對這個兩個GUID,如果不一致,那就不能使用。

當然上面那個原因只是一個表面現象,根本原因是既是兩份一模一樣的程式碼編譯器編譯出來的檔案可能是不一樣的。因為編譯器在編譯的時候會對程式碼進行最佳化,而同一份程式碼可能會有很多種最佳化的方法,它會根據當時的特定機器的環境等情況選擇一個最快的生成方法。所以它產生出來的檔案有可能是不一樣的!所以如果連產生出來的檔案都不一樣,那麼原來的那個PDB裡面的符號對應的位址就沒有意義了。

如何查看二進位檔案和PDB的GUID?

使用VS自帶的DUMPBIN工具可以查看二進位檔案所期望的PDB的GUID。基本用法就是DUMPBIN /HEADER 文件,具體用可可參考MSDN(http://msdn.microsoft.com/zh-cn/library/c1h23y6c(v=vs.80).aspx)。

查看PDB的GUID可以用下面這個工具,直接將PDB拉進去即可。

http://www.codeproject.com/Articles/37456/How-To-Inspect-the-Content-of-a-Program-Database-P

#PDB檔案的尋找策略

先上試驗結果,可以再調試的時候從Visual Studio 的Module串口中查找到一個module的symbol的查找策略。從截圖中我們可以看到結果如下:

pdb是什麼檔案?

1. 文件被執行或被載入的位址

2. 就是硬編碼在PE文件頭中的那個地址。大家可以看到obj\才是最原始產生的位址,只是之後就被拷貝到了第一個位址中去了。

2.5 如果設定了符號伺服器,第二步以後應該先去符號伺服器的快取目錄下找,如果找不到再去符號伺服器上去找。找到的話就會下載到快取目錄。

3. 第三部分是我VS中設定的一些符號查詢的目錄,因為我裝過Reflector所以預設加了這幾個目錄在我的設定中。

4. Windows資料夾。

這裡有一個比較有趣的現象就是,VS的查找策略都是會先找一個目錄下的symbol\exe\project.pdb,然後exe\project.pdb,最後才找project.pdb。這個順序有點出乎意料。

PDB檔案會影響效能麼?

可能有些人會覺得PDB檔案的產生會對最終的應用程式的效能產生一定的影響,所以覺得在發布版中不應該產生PDB檔案。

錯誤!對於.NET應用程式來說,產生PDB檔案不會影響編譯器的最佳化,所以也完全不會影響應用程式的效能。只會對於產生的程式集中的一個DebuggableAttribute的屬性產生影響。有興趣的人可以閱讀Do PDB Files Affect Performance?

相關影片教學推薦:《ASP.NET教學

以上是pdb是什麼檔案?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

分享幾個.NET開源的AI和LLM相關專案框架 分享幾個.NET開源的AI和LLM相關專案框架 May 06, 2024 pm 04:43 PM

當今人工智慧(AI)技術的發展如火如荼,它們在各個領域都展現了巨大的潛力和影響力。今天大姚給大家分享4個.NET開源的AI模型LLM相關的專案框架,希望能為大家提供一些參考。 https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.mdSemanticKernelSemanticKernel是一種開源的軟體開發工具包(SDK),旨在將大型語言模型(LLM)如OpenAI、Azure

C#的就業前景如何 C#的就業前景如何 Oct 19, 2023 am 11:02 AM

無論您是初學者還是有經驗的專業人士,掌握C#將為您的職業發展鋪平道路。

面向開發人員的.NET效能最佳化技術 面向開發人員的.NET效能最佳化技術 Sep 12, 2023 am 10:43 AM

如果你是.NET開發者,你必須意識到在交付高品質軟體方面,優化功能和效能的重要性。透過熟練使用提供的資源並減少網站載入時間,你不僅為使用者創造了愉快的體驗,還能減少基礎設施成本。

Java框架與.NET框架的效能差異 Java框架與.NET框架的效能差異 Jun 03, 2024 am 09:19 AM

在高並發請求處理方面,.NETASP.NETCoreWebAPI效能優於JavaSpringMVC,原因包括:AOT提前編譯,減少啟動時間;更精細的記憶體管理,由開發人員負責分配和釋放物件記憶體。

C#.NET面試問題和答案:提高您的專業知識 C#.NET面試問題和答案:提高您的專業知識 Apr 07, 2025 am 12:01 AM

C#.NET面試問題和答案包括基礎知識、核心概念和高級用法。 1)基礎知識:C#是微軟開發的面向對象語言,主要用於.NET框架。 2)核心概念:委託和事件允許動態綁定方法,LINQ提供強大查詢功能。 3)高級用法:異步編程提高響應性,表達式樹用於動態代碼構建。

C#.NET:探索核心概念和編程基礎知識 C#.NET:探索核心概念和編程基礎知識 Apr 10, 2025 am 09:32 AM

C#是一種現代、面向對象的編程語言,由微軟開發並作為.NET框架的一部分。 1.C#支持面向對象編程(OOP),包括封裝、繼承和多態。 2.C#中的異步編程通過async和await關鍵字實現,提高應用的響應性。 3.使用LINQ可以簡潔地處理數據集合。 4.常見錯誤包括空引用異常和索引超出範圍異常,調試技巧包括使用調試器和異常處理。 5.性能優化包括使用StringBuilder和避免不必要的裝箱和拆箱。

從網絡到桌面:C#.NET的多功能性 從網絡到桌面:C#.NET的多功能性 Apr 15, 2025 am 12:07 AM

C#.NETisversatileforbothwebanddesktopdevelopment.1)Forweb,useASP.NETfordynamicapplications.2)Fordesktop,employWindowsFormsorWPFforrichinterfaces.3)UseXamarinforcross-platformdevelopment,enablingcodesharingacrossWindows,macOS,Linux,andmobiledevices.

c#.net的持續相關性:查看當前用法 c#.net的持續相關性:查看當前用法 Apr 16, 2025 am 12:07 AM

C#.NET依然重要,因為它提供了強大的工具和庫,支持多種應用開發。 1)C#結合.NET框架,使開發高效便捷。 2)C#的類型安全和垃圾回收機制增強了其優勢。 3).NET提供跨平台運行環境和豐富的API,提升了開發靈活性。

See all articles