在 Visual Studio 偵錯工具 (C#、C++、Visual Basic、F#) 中指定符號 (.pdb) 和來源檔案

程式資料庫 (.pdb) 檔案 (也稱為符號檔案) 會將專案原始程式碼中的識別碼和陳述式對應至已編譯應用程式中的對應識別碼和指示。 這些對應檔案會將偵錯工具連結至您的原始程式碼,以啟用偵錯。

當您使用標準偵錯組建組態從 Visual Studio IDE 建置專案時,編譯器會建立適當的符號檔案。 本文說明如何在 IDE 中管理符號檔案,例如:

如需符號檔案的詳細說明,請參閱下列各項:

符號檔案的運作方式

.pdb 檔案會保留偵錯和專案狀態資訊,以便您的應用程式進行偵錯組態的累加連結。 Visual Studio 偵錯工具會在偵錯時使用 .pdb 檔案來判斷兩個主要資訊片段:

  • 要顯示在 Visual Studio IDE 中的來源檔案名稱和行號。
  • 中斷點要在應用程式中停止的位置。

符號檔案也會顯示來源檔案的位置,以及 (選擇性地) 顯示要從中擷取來源檔案的伺服器。

偵錯工具只會載入與建置應用程式時所建立的 .pdb 檔案完全相符的 .pdb 檔案 (也就是原始的 .pdb 檔案或複本)。 這是必要的重複項目,因為即使程式碼本身尚未變更,應用程式配置也可變更。 如需詳細資訊,請參閱 Why does Visual Studio require debugger symbol files to exactly match the binary files that they were built with? (Visual Studio 為何要求偵錯工具符號檔案必須完全符合當初建置這些符號檔案時所使用的二進位檔案?)

提示

若要對專案原始程式碼之外的程式碼進行偵錯 (例如,您專案呼叫的 Windows 程式碼或協力廠商程式碼),您就必須指定外部程式碼的 .pdb 檔案 (以及選擇性地指定原始程式檔) 的位置,且必須完全符合應用程式中的組建。

偵錯工具尋找符號的位置

當您在 Visual Studio IDE 中對專案進行偵錯時,偵錯工具會自動載入預設可找到的符號檔。

注意

在遠端裝置上偵錯受控程式碼時,所有符號檔都必須位於本機電腦上,或位於偵錯工具選項中指定的位置。

偵錯工具會在下列位置搜尋符號檔:

  1. 專案資料夾。

  2. DLL 或可執行檔 (.exe) 內部指定的位置。

    根據預設,如果您在電腦上建置了 DLL 或 .exe 檔案,連結器就會將相關聯 .pdb 檔案的完整路徑和檔案名稱放置在該 DLL 或 .exe 檔中。 偵錯工具會檢查該位置中是否存在符號檔。

  3. 與 DLL 或 .exe 檔案相同的資料夾。

  4. 符號檔偵錯工具選項中所指定的任何位置。 若要新增和啟用符號位置,請參閱設定符號位置及載入選項

    • 任何本機符號快取資料夾。

    • 指定在 Microsoft 符號伺服器 (如果選取) 等位置的網路、網際網路或本機符號伺服器和位置。 Visual Studio 可以從實作 symsrv 通訊協定的符號伺服器下載偵錯符號檔。 Visual Studio Team Foundation ServerDebugging Tools for Windows 是可以使用符號伺服器的兩項工具。

      您可以使用的符號伺服器包括:

      公用 Public Microsoft 符號伺服器:若要偵錯發生在系統 DLL 或協力廠商程式庫呼叫期間的損毀,通常會需要系統 .pdb 檔案。 系統 .pdb 檔案包含 Windows DLL、.exe 檔案和裝置磁碟機的符號。 您可以從公用 Microsoft 符號伺服器取得 Windows 作業系統、MDAC、IIS、ISA 和 .NET 的符號。

      內部網路或本機電腦上的符號伺服器:您的小組或公司可以為自己的產品建立符號伺服器,以及作為外部來源符號的快取。 您的電腦上可能有符號伺服器。

      協力廠商符號伺服器:Windows 應用程式和程式庫的協力廠商提供者可提供對網際網路上符號伺服器的存取。

      警告

      如果您使用公用 Microsoft 符號伺服器以外的其他符號伺服器,請確定該符號伺服器和其路徑值得信任。 由於符號檔可能包含任意可執行程式碼,因此可能會使您面臨安全性威脅。

設定符號檔的位置和載入選項

偵錯工具預設會檢查各個位置是否有符號。 請參閱偵錯工具尋找符號的位置

在 [工具]>[選項]>[偵錯]>[符號] 頁面上,您可以:

  • 指定並選取符號檔的搜尋路徑。
  • 指定 Microsoft、Windows 或協力廠商元件的符號伺服器。
  • 指定您需要或不需要讓偵錯工具自動載入符號的模組。
  • 在主動偵錯時變更這些設定。 請參閱在偵錯時載入符號

若要指定符號位置和載入行為:

  1. 在 Visual Studio 中,開啟 [工具]>[選項]>[偵錯]>[符號] (或 [偵錯]>[符號]>[偵錯])。

  2. 在 [符號檔 (.pdb) 位置] 底下,

    • 若要使用 [Microsoft 符號伺服器] 或 [NuGet.org 符號伺服器],請選取核取方塊。

    • 若要新增符號伺服器位置,

      1. 選取工具列中的 + 符號。
      2. 在文字欄位中輸入符號伺服器或符號位置的 URL (http)、網路共用或本機路徑。 陳述式完成可幫助您找出正確的格式。

      Tools - Options - Debugging - Symbols page

      Tools - Options - Debugging - Symbols page

      注意

      只會搜尋指定的資料夾。 您必須自行加入要搜尋的所有子資料夾。

    • 若要新增 Azure DevOps 符號伺服器位置:

      1. 選取工具列中的 Tools/ Options/ Debugging/Symbols new server icon 圖示。

      2. 在 [連線到 Azure DevOps 符號伺服器] 對話方塊中,選擇其中一個可用的符號伺服器,然後選取 [連線]

        如需詳細資訊,請參閱 [新增 Azure Artifacts 符號伺服器]

    • 若要變更符號位置的載入順序,請使用 Ctrl+向上鍵和 Ctrl+向下鍵,或向上鍵和向下鍵圖示。

    • 若要編輯 URL 或路徑,請按兩下項目,或選取項目,然後按 F2

    • 若要移除項目,請選取項目,然後選取 - 圖示。

  3. (選擇性) 若要改善符號載入效能,請在此目錄中的快取符號下,輸入符號伺服器可複製符號的本機資料夾路徑。

    注意

    請勿將本機符號快取放在受保護的資料夾中,例如 C:\Windows 或子資料夾。 請改用可讀寫的資料夾。

    注意

    針對 C++ 專案,如果您已設定 _NT_SYMBOL_PATH 環境變數,則會覆寫此目錄中快取符號底下設定的值。

  4. 指定您希望偵錯工具在啟動時從符號檔 (.pdb) 位置載入的模組。

    • 選取 [載入所有模組 (除非已排除)] (預設),以載入符號檔位置中所有模組的所有符號,但您特別排除的模組除外。 若要排除特定模組,請選取 [指定排除的模組]、選取 + 圖示、輸入要排除的模組名稱,然後選取 [確定]

    • 若只要載入您從符號檔位置指定的模組,請選取 [僅載入指定的模組]。 請選取 [指定包含的模組]、選取 + 圖示、輸入要包含的模組名稱,然後選取 [確定]。 不會載入其他模組的符號檔。

  5. 選取 [確定]。

偵錯的其他符號選項

您可以在 [工具]>[選項]>[偵錯]>[一般] (或 [偵錯]>[選項]>[一般]) 中選取其他符號選項:

  • 載入 DLL 匯出 (僅限原生)

    載入 C/C++ 的 DLL 匯出資料表。 如需詳細資料,請參閱 DLL 匯出資料表。 讀取 DLL 匯出資訊牽涉到一些額外負荷,因此預設會關閉載入匯出資料表。 您也可以在 C/C++ 組建命令列中使用 dumpbin /exports

  • 啟用位址層級偵錯如果來源無法使用,則顯示反組譯碼

    找不到來源或符號檔時,一律會顯示反組譯碼。

    Options / Debugging / General disassembly options

  • 啟用來源伺服器支援

    當本機電腦上沒有原始程式碼,或者 .pdb 檔不符合原始程式碼時,使用來源伺服器協助偵錯應用程式。 來源伺服器會接受對檔案的要求,並從原始檔控制傳回實際的檔案。 來源伺服器會使用名為 srcsrv.dll 的 DLL 來執行,以讀取應用程式的 .pdb 檔案。 .pdb 檔案含有原始程式碼儲存機制的指標,以及用來從儲存機制擷取原始程式碼的命令。

    您可以在名為 srcsrv.ini 的檔案中列出允許的命令,以限制 srcsrv.dll 可以從應用程式的 .pdb 檔案執行的命令。 將 srcsrv.ini 檔案放在與 srcsrv.dlldevenv.exe 相同的資料夾中。

    重要

    應用程式的 .pdb 檔案中可以內嵌任意命令,因此在 srcsrv.ini 檔案中務必僅加入您要執行的命令。 嘗試執行 srcsvr.ini 檔案中未包含的任何命令,會讓確認對話方塊出現。 如需詳細資訊,請參閱 Security Warning: Debugger Must Execute Untrusted Command

    由於不會對命令參數進行任何驗證,因此請謹慎使用受信任的命令。 例如,如果您在 srcsrv.ini 中列出 cmd.exe,惡意使用者可能會在 cmd.exe 上指定參數,使其變得危險。

    選取此項目和您所需的子項目。 [允許部分信任組件的來源伺服器 (僅限受控)] 和 [一律執行未受信任的來源伺服器命令而不須提示] 都可能提高安全性風險。

    Enable source server options

編譯器符號選項

當您從 Visual Studio IDE 建置專案並使用標準 [偵錯] 組建組態時,C++ 和受控編譯器會為您的程式碼建立適當的符號檔。 您也可以在程式碼中設定編譯器選項。

若要在 Visual Studio 中設定組建組態的編譯器選項,請參閱設定偵錯和發行組態

.NET 選項

使用 /debug 建置以建立 .pdb 檔案。 您可以使用 /debug:full/debug:pdbonly建置應用程式。 使用 /debug:full 建置會產生可偵錯的程式碼。 使用 /debug:pdbonly 進行建置則會產生 .pdb 檔案,但是不會產生用於通知 JIT 編譯器有可用偵錯資訊的 DebuggableAttribute。 如果您要為發行組建產生 .pdb 檔案,但不希望為可偵錯,則請使用 /debug:pdbonly。 如需詳細資訊,請參閱 /debug (C# 編譯器選項)/debug (Visual Basic)

C/C++ 選項

  • VC<x>.pdb<project>.pdb 檔案

    當您使用 /ZI 或 /Zi 建置時,會建立適用於 C/C++ 的 .pdb 檔。 在 Visual C++ 中,/Fd 選項會為編譯器所建立的 .pdb 檔案命名。 當您使用 IDE 在 Visual Studio 中建立專案時,就會設定 /Fd 選項,以建立名為 <project>.pdb.pdb 檔案。

    如果您在使用 Makefile 建置 C/C++ 應用程式時,指定了 /ZI/Zi,但沒有使用 /Fd 來指定檔案名稱,則編譯器會建立兩個 .pdb 檔:

    • VC<x>.pdb,其中 <x> 代表 Microsoft C++ 編譯器的版本,例如 VC11.pdb

      VC<x>.pdb 檔案會儲存個別物件檔案的所有偵錯資訊,且其所在位置與專案 Makefile 的目錄位置相同。 每次建立物件檔案時,C/C++ 編譯器都會將偵錯資訊合併到 VC<x>.pdb。 因此,即使每個原始程式檔都包含了常見的標頭檔 (例如 <windows.h>),這些標頭檔的 typedef 也只會儲存一次,而不會出現在每個物件檔案。 插入的資訊包括類型資訊,但是不包括符號資訊 (例如函式定義)。

    • <project>.pdb

      <project>.pdb 檔案會儲存專案 .exe 檔案的所有偵錯資訊,並放置在 \debug 子目錄中。 <project>.pdb 檔案包含完整的偵錯資訊,包括函式原型,而不僅是在 VC<x>.pdb 找到的類型資訊。

    VC<x>.pdb<project>.pdb 檔案都允許累加式更新。 連結器也會將路徑嵌入其所建立 .exe.dll 檔案中的 .pdb 檔。

  • DLL 匯出資料表

    若您想知道 DLL 匯出表中可使用的符號,請使用 dumpbin /exports 資料表。 若要使用 Windows 訊息、Windows 程序 (WindowProc)、COM 物件、封送處理 (Marshaling) 或是沒有其符號的任何 DLL,則 DLL 匯出表的符號資訊就會很有用。 這些符號適用於任何 32 位元系統 DLL。 這些呼叫都按呼叫順序列出,目前的函式 (巢狀最深處) 列在頂端。

    讀取 dumpbin /exports 輸出時,您可以看到確實的函式名稱,包含非英數字元。 查看確切的函式名稱對於在函式上設定中斷點很有用,因為函式名稱可在偵錯工具的其他位置截斷。 如需詳細資訊,請參閱 dumpbin /exports

Web 應用程式

將 ASP.NET 應用程式的 web.config 檔案設定為偵錯模式。 偵錯模式會導致 ASP.NET 產生動態產生之檔案的符號,並使偵錯工具附加到 ASP.NET 應用程式。 如果您已從 Web 專案範本建立專案,則 Visual Studio 會在開始偵錯時自動設定這個項目。

在偵錯時尋找並載入符號

您可以使用 [模組]、[呼叫堆疊]、[區域變數]、[自動變數] 或任何 [監看式] 視窗,在偵錯時載入符號或變更符號選項。 如需詳細資訊,請參閱更熟悉偵錯工具附加至您應用程式的方式

在 [模組] 視窗中使用符號

在偵錯期間,[模組] 視窗會顯示偵錯工具正在視為使用者程式碼 (或 [我的程式碼]) 的程式碼模組,以及其符號載入狀態。 您也可以在 [模組] 視窗中監視符號載入狀態、載入符號,以及變更符號選項。

若要在偵錯時監視或變更符號位置或選項:

  1. 若要在偵錯時開啟 [模組] 視窗,請選取 [偵錯]>[Windows]>[模組] (或按 Ctrl + Alt + U)。
  2. 在 [模組] 視窗中,以滑鼠右鍵按一下 [符號狀態] 或 [符號檔] 標頭,或任何模組。
  3. 在快顯功能表中,選取下列其中一個選項︰
選項 描述
載入符號 針對已略過、找不到或未載入符號的模組顯示。 嘗試從 [選項]>[偵錯]>[符號] 頁面上指定的位置載入符號。 如果找不到或未載入符號檔,便會啟動 [檔案總管],讓您能夠指定要搜尋的新位置。
符號載入資訊 顯示所載入符號檔的位置或是偵錯工具找不到檔案時所搜尋的位置。
符號設定 開啟 [選項]>[偵錯]>[符號] 頁面,您可以在其中編輯並新增符號位置。
永遠自動載入 將選取的符號檔新增至偵錯工具自動載入的檔案清單。

使用 [未載入符號]/[未載入來源] 頁面

有一些方式可讓偵錯工具中斷未提供符號或來源檔案的程式碼:

  • 逐步執行程式碼。
  • 從中斷點或例外狀況中斷程式碼。
  • 切換至不同的執行緒。
  • 按兩下 [呼叫堆疊] 視窗中的框架,以變更堆疊框架。

當這種情況發生時,偵錯工具就會顯示 [未載入符號] 或 [未載入來源] 頁面,協助您尋找及載入必要的符號或來源。

No Symbols Loaded page

若要使用 [未載入符號] 文件頁面來協助尋找及載入遺漏的符號:

  • 若要變更搜尋路徑,請選取未選取的路徑,或選取 [新增路徑] 或 [新增 VSTS 路徑],然後輸入或選取新的路徑。 選取 [載入] 可再次搜尋路徑,並且在找到符號檔時將它載入。
  • 若要覆寫任何符號選項,並重試搜尋路徑,請選取 [瀏覽並尋找<可執行檔名稱]>。 若找到符號檔隨即會將其載入,否則就會開啟 [檔案總管],讓您手動選取符號檔。
  • 若要開啟符號設定頁面來設定行為,請選取 [變更符號設定] (或選擇 [選項]>[偵錯]>[符號])。
  • (進階) 若要一次在新視窗中顯示反組譯碼,請選取 [檢視反組譯碼],或選取 [選項] 對話方塊,以設定在找不到來源或符號檔時,一律顯示反組譯碼的選項。 如需詳細資訊,請參閱檢視反組譯碼
  • 若要顯示所搜尋的位置和結果,請展開 [符號載入資訊]
  • 針對 C# 程式碼,您也可以選擇從 [未載入符號] 或 [未載入來源] 頁面反向組譯原始程式碼。

如果偵錯工具在您執行其中一個選項之後找到 .pdb 檔案,且偵錯工具能夠使用 .pdb 檔案中的資訊來擷取來源檔案,則會顯示來源。 否則,其會顯示描述問題的 [未載入來源] 頁面,其中包含可能解決問題的動作連結。

若要將來源檔案搜尋路徑新增至解決方案:

您可以指定偵錯工具搜尋來源檔案的位置,並從搜尋中排除特定檔案。

  1. 在 [方案總管] 中選取解決方案,然後選取 [屬性] 圖示,按 Alt+Enter 鍵,或者以滑鼠右鍵按一下並選取 [屬性]

  2. 選取 [偵錯來源檔案]

    Debug source files page

  3. 在 [包含原始程式碼的目錄] 底下,輸入或選取要搜尋的原始程式碼位置。 使用 [新行] 圖示來新增更多位置、使用向上向下箭號圖示加以重新排序,或是使用 [X] 圖示加以刪除。

    注意

    偵錯工具只會搜尋指定的目錄。 您必須自行加入要搜尋的所有子目錄項目。

  4. 在 [不要尋找這些來源檔案] 底下,輸入要從搜尋中排除的來來源檔案名稱。

  5. 選取 [確定] 或 [套用]