Dot-Net

發布生成 .pdb 文件,為什麼?

  • March 28, 2011

為什麼 Visual Studio 2005.pdb在發佈時編譯時會生成文件?我不會調試發布版本,那麼為什麼會生成它們?

**因為沒有 PDB 文件,就不可能通過地址級調試以外的任何方式來調試“發布”版本。**優化確實會對您的程式碼產生影響,如果出現問題(例如,拋出異常),很難找到罪魁禍首。即使設置斷點也非常困難,因為原始碼行無法與生成的彙程式式碼一對一匹配(甚至與生成的彙程式式碼的順序相同)。PDB 文件可以幫助您和調試器,使事後調試變得更加容易。

您指出,如果您的軟體已準備好發布,那麼您應該在那時完成所有調試。雖然這當然是真的,但有幾點需要牢記:

  1. 應該使用“發布”版本測試和調試您的應用程序(在發布之前)。這是因為打開優化(在“調試”配置下預設禁用)有時會導致出現您無法捕捉到的細微錯誤。當您進行此調試時,您將需要 PDB 符號。
  2. 客戶經常報告僅在“理想”條件下出現的邊緣情況和錯誤。這些東西幾乎不可能在實驗室中重現,因為它們依賴於使用者機器的一些古怪配置。如果他們是特別有幫助的客戶,他們會報告引發的異常並為您提供堆棧跟踪。或者他們甚至會讓你借用他們的機器來遠端調試你的軟體。在任何一種情況下,您都需要 PDB 文件來幫助您。
  3. 始終在啟用優化的“發布”版本上進行分析。再一次,PDB 文件派上用場了,因為它們允許將被分析的彙編指令映射回您實際編寫的原始碼。

編譯後您無法返回並生成 PDB 文件。*如果你沒有在建構過程中創建它們,你就失去了機會。創建它們並沒有什麼壞處。如果你不想分發它們,你可以簡單地從你的二進製文件中省略它們。但是,如果您後來決定要它們,那您就不走運了。最好始終生成它們並存檔副本,以防萬一您需要它們。

如果您真的想關閉它們,那始終是一種選擇。在項目的“屬性”視窗中,將要更改的任何配置的“調試資訊”選項設置為“無”。

但是請注意,“Debug”和“Release”配置預設使用不同的設置來發出調試資訊*。*您將希望保留此設置。Debug 版本的“Debug Info”選項設置為“full”,這意味著除了 PDB 文件之外,調試符號資訊也嵌入到程序集中。您還可以獲得支持編輯並繼續等酷炫功能的符號。在 Release 模式下,選擇了“pdb-only”選項,就像聽起來一樣,它只包含 PDB 文件,而不影響程序集的內容。因此,它並不像目錄中是否存在 PDB 文件那麼簡單/bin。但假設您使用“pdb-only”選項,PDB 文件'

正如Marc Sherman 在評論中指出的那樣,只要您的原始碼沒有更改(或者您可以從版本控制系統中檢索原始程式碼),您就可以重建它並生成匹配的 PDB 文件。至少,通常情況下。這在大多數情況下執行良好,但不能保證每次編譯相同程式碼時編譯器都會生成相同的二進製文件,因此可能存在細微差別。更糟糕的是,如果您同時對工具鏈進行了任何升級(例如為 Visual Studio 應用服務包),則 PDB 匹配的可能性更小。保證事後的可靠生成*PDB 文件,您不僅需要存檔版本控制系統中的原始碼,還需要存檔整個建構工具鏈的二進製文件,以確保您可以精確地重新創建建構環境的配置。不用說,簡單地創建和歸檔 PDB 文件要容易得多。

引用自:https://stackoverflow.com/questions/5457095