符號

符號可用於偵錯和其他診斷工具。 符號檔案的內容會因語言、編譯器和平台而異。 大體而言,符號是原始程式碼與編譯器所產生的二進位之間的對應。 Visual StudioVisual Studio Code 等工具會使用這些對應來解析原始程式碼行號資訊或區域變數名稱。

關於符號的 Windows 文件內有更多關於 Windows 符號的詳細資訊,不過其中的許多概念也適用於其他平台。

了解 .NET 的可攜式 PDB 格式

.NET Core 引進了新的符號檔案 (PDB) 格式:可攜式 PDB。 不同於僅限 Windows 的傳統 PDB,可攜式 PDB 可在所有平台上建立和讀取。

什麼是 PDB?

PDB 檔案是編譯器產生的輔助檔案,可向其他工具 (特別是偵錯工具) 提供主要的可執行檔有何內容及其產生方式的相關資訊。 例如,偵錯工具可讀取 PDB 以將 foo.cs 的第 12 行對應至正確的可執行檔位置,以便設定中斷點。 Windows PDB 格式已存在很久,並且是從甚至更早的其他原生偵錯符號格式演化而來。 其一開始是適用於原生 (C/C++) 程式的格式。 在第一版的 .NET Framework 中,Windows PDB 格式已擴充為可支援 .NET。

可攜式 PDB 格式是在 .NET Core 中引進的,預設會在以 .NET Core 和 .NET 5+ 為目標時使用此格式。 以 .NET Framework 為目標時,您可以在專案檔中指定 <DebugType>portable</DebugType> 以啟用可攜式 PDB 符號。 可攜式 PDB 格式的基礎是 ECMA-335 中繼資料格式。 如需詳細資訊,請參閱可攜式 PDB v1.0:格式規格。 診斷工具可以使用 System.Reflection.Metadata 程式庫來讀取可攜式 PDB 檔案 (如需範例,請參閱 System.Reflection.Metadata.Document)。

針對案例使用正確的 PDB 格式

並非所有環境都支援可攜式 PDB 或 Windows PDB,因此您必須考慮專案的使用和偵錯場所,才能決定要使用的格式。 如果您的專案要能夠在這兩種格式中使用和偵錯,您可以使用不同的組建組態,並建置該專案兩次,以支援這兩種類型的取用者。

可攜式 PDB 的支援

您可以在任何作業系統上讀取可攜式 PDB,而且可攜式 PDB 也是受控程式碼的建議符號格式,但有許多舊版工具和應用程式不支援可攜式 PDB:

  • 以 .NET Framework 4.7.1 或更早版本為目標的應用程式:將帶有對應的堆疊追蹤列印回行號 (例如在 ASP.NET 錯誤頁面中)。 方法的名稱不受影響,不受支援的只有原始程式檔名稱和行號。

  • 使用 ildasm 或 .NET 反映程式等 .NET 解編程式,並預期會看到原始程式碼行對應或本機參數名稱。

  • 最新版的 DIA 和工具會使用它來讀取符號,例如 WinDBG 支援可攜式 PDB,但較舊的版本則不支援。

  • 可能有舊版分析工具不支援可攜式 PDB。

若要在不支援可攜式 PDB 的工具上使用可攜式 PDB,您可以嘗試使用 Pdb2Pdb,以在可攜式 PDB 與 Windows PDB 之間進行轉換。

Windows PDB 的支援

Windows PDB 只能在 Windows 上寫入或讀取。 針對受控程式碼使用 Windows PDB 的做法已過時,只有舊版工具才需要這麼做。 建議您使用可攜式 PDB 而非 Windows PDB,因為某些較新的編譯器功能只會針對可攜式 PDB 來實作。

另請參閱