在 Visual Studio 調試程式中指定符號 (.pdb) 和來源檔案 (C#, C++, Visual Basic, F#)
程序資料庫(.pdb)檔案,也稱為符號檔,將專案原始程式碼中的標識符和語句對應到已編譯應用程式中的對應標識符和指令。 這些對應檔案會將調試程序連結至您的原始程式碼,以啟用偵錯。
當您使用標準偵錯組建組態從Visual Studio IDE 建置專案時,編譯程式會建立適當的符號檔。 本文說明如何在 IDE 中管理符號檔,例如:
如需符號檔的詳細說明,請參閱下列各項:
符號檔的運作方式
.pdb 檔案會保存偵錯和專案狀態資訊,以允許對應用程式的偵錯組態進行累加連結。 Visual Studio 調試程式會使用 .pdb 檔案,在偵錯時判斷兩個主要資訊片段:
- 待顯示在 Visual Studio IDE 中的原始程式檔名稱和行號。
- 應用程式中應在哪個位置設置斷點來停止。
符號檔也會顯示來源檔案的位置,並選擇性地顯示要從中擷取來源檔案的伺服器。
調試程式只會載入 .pdb 檔案,與建置應用程式時所建立的 .pdb 檔案完全相符(也就是原始 .pdb 檔案或複本)。 這是必要的重複項目,因為即使程序代碼本身尚未變更,應用程式配置也可以變更。 如需詳細資訊,請參閱 為什麼Visual Studio需要調試程式符號檔才能完全符合其所建置的二進位檔?
提示
若要在專案原始程式碼之外偵錯程式代碼,例如 Windows 程式代碼或專案呼叫的第三方程式代碼,您必須指定外部程式碼 .pdb 檔案的位置(以及選擇性地指定原始程式檔),這必須完全符合您應用程式中的組建。
偵錯工具搜尋符號的位置
當您在 Visual Studio IDE 中偵錯專案時,調試程式會自動載入預設可找到的符號檔。
除錯程式會在下列位置搜尋符號檔:
項目資料夾。
DLL 或可執行檔案 (.exe) 檔案內指定的位置。
根據預設,如果您在計算機上建置 DLL 或 .exe 檔案,鏈接器會將相關聯 .pdb 檔案的完整路徑和檔名放在 DLL 或 .exe 檔案中。 調試程式會檢查符號檔是否存在於該位置。
與 DLL 或 .exe 檔案相同的資料夾。
符號檔之調試程序選項中指定的任何位置。 若要新增與啟用符號位置,請參閱 設定符號位置和載入選項。
任何本機符號快取資料夾。
指定的網路、因特網或本機符號伺服器和位置,例如選取的Microsoft符號伺服器。 Visual Studio 可以從實作
symsrv
通訊協定的符號伺服器下載偵錯符號檔。 Visual Studio Team Foundation Server 和適用於 Windows 的 偵錯工具是兩個可以使用符號伺服器的工具。您可以使用的符號伺服器包括:
公用Microsoft符號伺服器:若要對系統 DLL 或第三方連結庫呼叫期間發生的當機進行偵錯,您通常需要系統 .pdb 檔案。 系統 .pdb 檔案包含 Windows DLL、.exe 檔案和設備驅動器的符號。 您可以從公用Microsoft符號伺服器取得 Windows 作業系統、MDAC、IIS、ISA 和 .NET 的符號。
內部網路上或本機計算機上的符號伺服器:您的小組或公司可以為自己的產品建立符號伺服器,以及做為來自外部來源之符號的快取。 您可能在自己的電腦上有符號伺服器。
第三方符號伺服器:Windows 應用程式和連結庫的第三方提供者可以提供因特網上符號伺服器的存取權。
警告
如果您使用公用Microsoft符號伺服器以外的符號伺服器,請確定符號伺服器及其路徑值得信任。 因為符號檔可以包含任意可執行的程式代碼,因此您可以公開給安全性威脅。
設定符號檔的位置和載入選項
調試程式預設會檢查各種位置是否有符號。 請參閱 除錯器尋找符號的地方。
在 [工具] [] [>] [] 選項 [] [>] [] 除錯 [] [>] [] 符號 [] 頁面上,您可以:
- 指定並選取符號檔的搜尋路徑。
- 指定用於 Microsoft、Windows 或第三方元件的符號伺服器。
- 指定您執行或不想讓調試程式自動載入符號的模組。
- 在主動偵錯時變更這些設定。 在偵錯 時,請參閱載入符號。
若要指定符號位置和載入選項:
注意
這些選項已在 Visual Studio 2022 17.12 版 Preview 1 中更新。
在 Visual Studio 中,開啟 工具>選項>偵錯>符號 (或 偵錯>選項>符號)。
在符號檔(.pdb)位置下,,
若要使用 Microsoft符號伺服器 或 NuGet.org 符號伺服器,請選取複選框。
若要新增符號伺服器位置,
- 選取工具列中的 + 符號。
- 在文字欄位中輸入符號伺服器或符號位置的 URL (HTTP)、網路共用或本機路徑。 語句補全工具可協助您尋找正確的格式。
注意
只會搜尋指定的資料夾。 您必須為想要搜尋的每個子資料夾新增項目。
(選擇性)若要改善符號載入效能,請在 [快取符號] 底下,輸入符號伺服器可以複製符號的本機資料夾路徑。
注意
請勿將本機符號快取放在受保護的資料夾中,例如 C:\Windows 或子資料夾。 請改用讀寫資料夾。
注意
如果您已設定 _NT_SYMBOL_PATH
環境變數,它會覆寫此目錄 中快取符號下設定的值。
指定您希望調試程式在啟動時從 符號檔 (.pdb) 位置載入的模組。
選取 [自動選擇要搜尋 的模組符號 (建議) 以允許 Visual Studio 決定要搜尋和載入哪些符號。 根據預設,Visual Studio 會自動載入由開啟的解決方案所建置的符號,並載入執行一般偵錯作業所需的任何其他符號。 這樣可減少 Visual Studio 必須搜尋和載入的檔案數目,以改善調試程式效能。 您可以點擊 指定模組篩選 連結,強制載入其他符號。
選取 [搜尋所有模組符號,除非排除 以強制 Visual Studio 在偵錯程式中載入所有符號。 不建議這麼做,因為它可能會減緩偵錯體驗。 如果您選取此選項,您可以按下 [指定模組篩選 連結],強制 Visual Studio 忽略特定符號。
選取 [載入所有模組],除非排除 [](此為預設值),會載入符號檔位置中所有模組的所有符號,僅排除您特別排除的模組。 若要排除特定模組,請選取 [[指定排除的模組],選取 + 圖示,輸入要排除的模組名稱,然後選取 [確定] 。
若要只載入您從符號檔位置指定的模組,請選擇 [只載入指定的模組。 選取 [指定包含的模組],選取 + 圖示,輸入要包含的模組名稱,然後選取 確定。 不會載入其他模組的符號檔。
選取 [確定]。
指定模組篩選
這兩個選項 自動選擇要搜尋的模組符號 和 搜尋所有模組符號,除非排除,使您能夠在偵錯時更精細地控制要搜尋的符號。 選擇 [指定模組篩選 來微調您的體驗。
根據預設,當您 自動選擇要搜尋 的模組符號時,您會看到下列對話方塊:
您可以使用 『+』 圖示,將模組新增至篩選。 模組篩選支持簡單的通配符比對。 '*' 匹配任何一組字元。 例如,『*myproduct*』 會比對 『myproduct.utilities.dll』 和 'entrypoint.myproduct.exe'等檔案。
有數個其他選項可進一步自定義您的體驗:
總是載入位於模組旁邊的符號檔案, 會指示 Visual Studio 載入儲存在檔案系統中的 pdb 檔案,這些檔案會和其對應的 .dll 或 .exe 檔案一起載入。 例如,嘗試偵錯已部署的 web 應用程式時,這會有幫助。
視需要自動載入其他符號 指示 Visual Studio 搜尋符號以執行常見的偵錯動作,例如逐步執行,即使您將逐步執行的模組不在專案或模組篩選中也一樣。 判斷搜尋的方式可能會受到您 Just My Code 設定的影響。
如果您選擇了 搜尋所有模組符號(除非排除),則模組篩選對話框看起來會像這樣:
在此對話框中,您可以選擇您 未 想要 Visual Studio 載入符號的模組。 在此案例中,除非您新增相符的篩選條件以排除它們,否則 Visual Studio 會嘗試載入偵錯程式中每個模組的符號(包括第三方的模組)。 此行為唯一的修改方式,就是您的 Just My Code 設定。
偵錯的其他符號選項
您可以在 [工具]>[選項]>[偵錯]>[一般] 中選取其他符號選項(或 [偵錯>選項]>[一般] 中:
載入 DLL 輸出(僅適用於原生)
載入 C/C++的 DLL 匯出資料表。 如需詳細資訊,請參閱 DLL 匯出數據表。 讀取 DLL 匯出資訊牽涉到一些額外負荷,因此預設會關閉載入匯出數據表。 您也可以在 C/C++組建命令行中使用
dumpbin /exports
。啟用位址層級偵錯,並在來源無法使用時 顯示反組譯碼
找不到來源或符號檔時,一律會顯示反組譯碼。
啟用來源伺服器支援
當本機計算機上沒有原始程式碼,或 .pdb 檔案不符合原始程式碼時,使用來源伺服器來協助偵錯應用程式。 來源伺服器會接收檔案請求,並從原始碼控制中返回實際檔案。 來源伺服器會使用名為 srcsrv.dll 的 DLL 執行,以讀取應用程式的 .pdb 檔案。 .pdb 檔案包含原始程式碼存放庫的指標,以及用來從存放庫擷取原始程式碼的命令。
您可以藉由在名為 srcsrv.ini的檔案中列出允許的命令,以限制 srcsrv.dll 可以從應用程式的 .pdb 檔案中執行的命令。 將 srcsrv.ini 檔案放在與 srcsrv.dll 相同的資料夾中,並 devenv.exe。
重要
任意命令可以內嵌在應用程式的 .pdb 檔案中,因此請務必只將您想要執行的命令放入 srcsrv.ini 檔案中。 任何嘗試執行不在 srcsvr.ini 檔案中的命令,都會導致出現確認對話方塊。 如需詳細資訊,請參閱 安全性警告:調試程式必須執行不受信任的命令。
在命令參數上不會執行驗證,因此請小心信任的命令。 例如,如果您在 srcsrv.ini中列出 cmd.exe,惡意使用者可能會在 cmd.exe 上指定參數,使其變得危險。
選取此項目和您想要的子項目。 允許部分信任元件的來源伺服器(僅限受管理) 和 一律執行不受信任的來源伺服器命令,而不會提示 會增加安全性風險。
編譯程式符號選項
當您使用標準 偵錯 建置組態從Visual Studio IDE 建置專案時,C++和 Managed 編譯程式會為您的程式代碼建立適當的符號檔。 您也可以在程式代碼中設定編譯程序選項。
若要在 Visual Studio 中設定組建組態的編譯程式選項,請參閱 設定偵錯和發行組態。
.NET 選項
使用 /debug 建置,以建立 .pdb 檔案。 您可以使用 /debug:full 或 /debug:pdbonly建置應用程式。 使用 /debug:full 建置, 會產生可偵錯的程式代碼。 使用 /debug:pdbonly 建置 會產生 .pdb 檔案,但不會產生 DebuggableAttribute
,告知 JIT 編譯程式偵錯資訊可用。 如果您想要針對不希望能夠偵錯的釋出版本生成 .pdb 檔案,請使用 /debug:pdbonly。 如需詳細資訊,請參閱 /debug (C# 編譯程式選項) 或 /debug (Visual Basic)。
C/C++ 選項
VC<x>.pdb 和 <項目>.pdb 檔案
當您使用 /ZI 或 /Zi建置時,會建立 C/C++的 .pdb 檔案。 在 Visual C++ 中,/Fd 選項會將編譯程式所建立 .pdb 檔案命名為 。 當您使用 IDE 在 Visual Studio 中建立專案時,/Fd 選項會設定為建立名為 .pdb <專案>.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>,來自這些標頭的 typedefs 只會儲存一次,而不是儲存在每個對象檔中。 插入的資訊包含類型資訊,但不包含符號資訊,例如函式定義。
<專案>.pdb
<專案>.pdb 檔案會儲存專案 .exe 檔案的所有偵錯資訊,並位於 \debug 子目錄中。 <專案>.pdb 檔案包含完整的偵錯資訊,包括函式原型,而不只是在 VC<x>.pdb中找到的類型資訊。
VC<x>.pdb 和 <項目>.pdb 檔案都允許累加式更新。 鏈接器也會在所建立 .exe 或 .dll 檔案中內嵌 .pdb 檔案的路徑。
-
使用
dumpbin /exports
來查看 DLL 匯出資料表中可用的符號。 DLL 匯出表中的符號資訊對於處理 Windows 訊息、Windows 程式(WindowProcs)、COM 物件、封送處理,或任何您沒有符號的 DLL 都非常有用。 符號適用於任何 32 位系統 DLL。 目前的呼叫順序是從底層到頂層排列,最深巢狀的目前函式位於最上方。藉由讀取
dumpbin /exports
輸出,您可以看到確切的函式名稱,包括非英數位元。 查看確切的函式名稱對於在函式上設定斷點很有用,因為函式名稱可以在調試程式的其他位置截斷。 如需詳細資訊,請參閱 dumpbin /exports。
Web 應用程式
將 ASP.NET 應用程式的 web.config 檔案設定為偵錯模式。 偵錯模式會導致 ASP.NET 產生動態產生的檔案符號,並讓調試程式附加至 ASP.NET 應用程式。 如果您從 Web 專案範本建立專案,Visual Studio 會在您開始偵錯時自動設定此設定。
偵錯時載入符號
您可以使用 模組、呼叫堆疊、局部變數、自動或任何 監看 視窗載入符號,或在偵錯時變更符號選項。 如需詳細資訊,請參閱 深入瞭解調試程式如何附加至您的應用程式。
在 [模組] 視窗中使用符號
在偵錯期間,[模組] 視窗會顯示偵錯工具視為使用者程式碼或「我的程式碼」的程式碼模組,以及其符號載入狀態。 您也可以在 [模組] 視窗中監視符號載入狀態、載入符號,以及變更符號選項。
偵錯時監視或變更符號位置或選項:
- 若要開啟 [模組] 視窗,請在偵錯時選取 [偵錯>Windows>模組] (或 按 ctrl + Alt + U)。
- 在 [模組] 視窗中,以滑鼠右鍵按兩下 符號狀態 或 符號檔 標頭或任何模組。
- 在操作功能表中,選取下列其中一個選項:
選擇 | 描述 |
---|---|
載入符號 | 針對已略過、找不到或未載入符號的模組顯示。 嘗試從 選項>偵錯>符號 頁面上指定的位置載入符號。 如果找不到或未載入符號檔,請啟動 [檔案總管],以便您可以指定要搜尋的新位置。 |
符號載入資訊 | 顯示載入符號檔的位置,或調試程式找不到檔案時所搜尋的位置。 |
符號設定 | 開啟 選項>偵錯>符號 頁面,您可以在其中編輯和新增符號位置。 |
總是自動載入 | 將選取的符號檔新增至調試程式自動載入的檔案清單。 |
使用未載入符號頁面/未載入來源頁面
除錯程式有數種方式可以分成沒有符號或原始程式檔的程式代碼:
- 投入編程。
- 從斷點或例外狀況中斷程序代碼。
- 切換至不同的線程。
- 雙擊 呼叫堆疊 窗口中一個框架,以變更堆疊框架。
發生這種情況時,調試程式會顯示 未載入符號 或 未載入來源 頁面,以協助您尋找和載入必要的符號或來源。
若要使用 [未載入符號] 文件頁面來協助尋找和載入遺漏符號:
- 若要變更搜尋路徑,請選取未選取的路徑,或選取 [新路徑] 或 [新增 VSTS 路徑],然後輸入或選取新的路徑。 選取 [載入],以再次搜尋路徑,並在找到符號檔時載入。
- 若要覆蓋任何符號選項並重試搜尋路徑,請選取 [瀏覽],然後尋找 <可執行檔名稱>。 如果找到了符號檔案,將其載入;否則,檔案總管 會開啟,讓您可以手動選取符號檔案。
- 若要開啟符號設定頁面以設定行為,請選取 [變更符號設定] [變更符號設定] [選項]>[偵錯]>[符號]。
- (進階)若要一次在新視窗中顯示反組譯碼,請選取 [檢視反組譯碼],或選取 [選項] 對話框 設定選項,以在找不到來源或符號檔時一律顯示反組譯碼。 如需詳細資訊,請參閱 檢視反組譯碼。
- 若要顯示搜尋的位置和結果,請展開 符號載入資訊。
- 針對 C# 程式代碼,您也可以選擇 從 未載入符號 或 未載入來源 頁面來反編譯 原始程式碼。
如果調試程式在執行其中一個選項之後找到 .pdb 檔案,而且可以使用 .pdb 檔案中的資訊來擷取來源檔案,則會顯示來源。 否則,它會顯示 [未載入來源] 頁面,其中包含可能解決問題的資訊和動作連結。
若要將來源檔案搜尋路徑新增至解決方案:
您可以指定調試程式搜尋來源檔案的位置,並從搜尋中排除特定檔案。
在 [方案總管 ]中選取方案,然後選取 [屬性] 圖示、按 Alt+Enter,或以滑鼠右鍵按兩下 ,然後選取 [屬性]。
選取 偵錯來源檔案。
在包含原始程式碼的 目錄中,輸入或選取要搜尋的原始碼位置。 使用 新行 圖示來新增更多位置,向上 和 向下 箭頭圖示來重新排序它們,或 X 圖示加以刪除。
注意
調試程式只會搜尋指定的目錄。 您必須為任何想要搜尋的子目錄新增條目。
在 [[不要尋找這些來源檔案]下,輸入要從搜尋中排除的來源檔名。
選取 [確定] 或 [套用]。