1. 程式人生 > >在 Visual Studio 偵錯程式中指定符號 (.pdb) 和原始檔

在 Visual Studio 偵錯程式中指定符號 (.pdb) 和原始檔

釋出日期: 2016年6月

若要了解有關 Visual Studio 2017 RC 的最新文件,請參閱 Visual Studio 2017 RC 文件

程式資料庫 (.pdb) 檔案(也稱為符號檔案)將你在類、方法和其他程式碼的原始檔中建立的識別符號對映到在專案的已編譯可執行檔案中使用的識別符號。 .pdb 檔案還可以將原始碼中的語句對映到可執行檔案中的執行指令。 偵錯程式使用此資訊確定兩個關鍵資訊:顯示在 Visual Studio IDE 中的原始檔和行號,以及可執行檔案中在設定斷點時要停止的位置。 符號檔案還包含原始檔的原始位置以及(可選)源伺服器的位置(可從中檢索原始檔)。

在 Visual Studio IDE 中除錯專案時,偵錯程式知道查詢程式碼的 .pdb 和原始檔的預設位置。 如果要在專案原始碼之外除錯程式碼(如專案呼叫的 Windows 或第三方程式碼),則你必須指定 .pdb(也可以是外部程式碼的原始檔)的位置,這些檔案需要與可執行檔案完全匹配。

在 Visual Studio 2012 之前,在遠端裝置上除錯託管的程式碼時,需要將符號檔案放置在遠端計算機上。 現在,這已經不成問題了。 所有符號檔案必須位於本地計算機上或“工具”/“選項”/“除錯”/“符號”頁中指定的位置。

偵錯程式搜尋.pdb檔案的位置

  1. 在 DLL 或可執行檔案中指定的位置。

    (預設情況下,如果你在計算機上已生成 DLL 或可執行檔案,則連結器會將關聯的 .pdb 檔案的完整路徑和檔名放入 DLL 或可執行檔案中。 偵錯程式首先會檢查在 DLL 或可執行檔案內指定的位置中是否存在符號檔案。 這很有幫助,因為你的計算機上始終有可供已編譯程式碼使用的符號。)

  2. 可存在於與 DLL 或可執行檔案相同資料夾中的 .pdb 檔案。

  3. 所有本地符號快取資料夾。

  4. 在 Microsoft 符號伺服器(如果啟用)等上指定的任何網路、Internet 或本地符號伺服器和位置。

為什麼符號檔案需要與可執行檔案完全匹配?

偵錯程式只會為可執行檔案載入與該可執行檔案生成之時所建立的 .pdb 檔案完全匹配的 .pdb 檔案(即該 .pdb 檔案必須是原始 .pdb 檔案或其副本)。 由於除了建立正確且高效的程式碼的主要任務之外,編譯器的編譯速度也得到了優化,因此可執行檔案的實際佈局可更改,即使程式碼本身未更改也是如此。 有關詳細資訊,請參閱為什麼 Visual Studio 要求偵錯程式符號檔案必須與同時生成的二進位制檔案完全匹配?

指定符號位置和載入行為

在 VS IDE 中除錯專案時,偵錯程式將自動載入位於專案目錄中的符號檔案。 可以在“工具”/“選項”/“除錯”/“符號”中為 Microsoft、Windows 或第三方元件指定備選搜尋路徑和符號伺服器。還可以指定希望偵錯程式自動為其載入符號的模板。 之後,你可以在主動進行除錯時手動更改這些設定。

  1. 在 Visual Studio 中,開啟“工具”/“選項”/“除錯”/“符號”頁。


  2. 選擇資料夾 工具/ 選項/ 除錯/符號資料夾圖示 圖示。“符號檔案(.pdb)位置”框中將顯示可編輯的文字。

  3. 鍵入符號伺服器或符號位置的 URL 或目錄路徑。 語句結束有助於找到正確的格式。

  4. 若要改進符號載入效能,請在路徑中鍵入符號可由“在此目錄下快取符號”框中的符號伺服器複製的本地目錄,或可將符號複製到其中的本地目錄。

    System_CAPS_ICON_note.jpg 說明

    不要將符號快取放入受保護資料夾(例如,C:\Windows 資料夾或其子資料夾之一)。 而應使用可讀寫的資料夾。

指定符號載入行為

你可指定開始除錯時要從“符號檔案(.pdb)位置”框位置自動載入的檔案。 始終載入專案目錄中的符號檔案。

  1. 選擇“除排除模組之外的所有模組”來為所有模組(除了你在選擇“指定排除的模組”連結時指定的模組之外)載入所有符號。

  2. 選擇“僅指定的模組”選項,然後選擇“指定模組”來列出要自動載入其符號檔案的模組。 其他模組的符號檔案被忽略。

指定其他符號選項

還可以在“工具”/“選項”/“除錯”/“符號”頁設定以下選項:

啟動時若無符號則發出警告(僅限本機)

選定後,如果嘗試除錯在偵錯程式中沒有對應符號資訊的程式,系統將顯示警告對話方塊。

載入 DLL 匯出

選定後,載入 DLL 匯出表。 處理 Windows 訊息、Windows 過程 (WindowProc)、COM 物件、封送或不具有其符號的任何 DLL 時,DLL 匯出表中的符號資訊將很有用。 讀取 DLL 匯出資訊會佔用一些系統開銷。 因此,預設情況下此功能被禁用。

若要檢視 DLL 匯出表中的可用符號,請使用 dumpbin /exports。 符號可用於任何 32 位系統 DLL。 從 dumpbin /exports 輸出中,可以檢視到精確的函式名,包括非字母數字字元。 這對於在函式上設定斷點很有用。 DLL 匯出表中的函式名在偵錯程式的其他位置似乎被截斷了。 呼叫將按呼叫順序列出,當前函式(巢狀最深的函式)位於頂端。 有關詳細資訊,請參閱 dumpbin /exports

使用符號伺服器查詢不在你的本地計算機上的符號檔案

Visual Studio 可從實現 symsrv 協議的符號伺服器下載除錯符號檔案。Visual Studio Team Foundation ServerWindows 除錯工具是可實現符號伺服器的兩個工具。 在 VS“選項”對話方塊中指定要使用的符號伺服器。

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

Microsoft 公共符號伺服器

若要除錯在呼叫系統 DLL 或第三方庫時出現的故障,通常需要使用系統 .pdb 檔案,這些檔案包含表示 Windows DLL、EXE 以及裝置驅動程式的符號。 你可從 Microsoft 公共符號伺服器獲取這些符號。 除了 MDAC、IIS、ISA 和 .NET Framework 之外,Microsoft 公共符號伺服器為 Windows 作業系統提供符號。

若要使用 Microsoft 符號伺服器,請選擇“除錯”選單上的“選項和設定”,然後選擇“符號”。 選擇“Microsoft 符號伺服器”

內部網路或本地計算機上的符號伺服器

你的團隊或公司可為你自己的產品建立符號伺服器,並作為外部源符號的快取。 你自己的計算機上可能具有符號伺服器。 你可在 VS“選項”對話方塊的“除錯”/“符號”頁上輸入符號伺服器的位置作為 URL 或路徑。

第三方符號伺服器

Windows 應用程式和庫的第三方提供程式可提供對 Internet 上的符號伺服器的訪問。 你還可在“除錯”/“符號”頁上輸入這些符號伺服器的 URL。

System_CAPS_ICON_note.jpg 說明

如果使用 Microsoft 公共符號伺服器以外的符號伺服器,請確保該符號伺服器及其路徑是可信任的。 由於符號檔案可以包含任意可執行程式碼,因此你可能面臨安全威脅。

除錯時查詢並載入符號

只要偵錯程式處於中斷模式,你就可以為之前被偵錯程式選項排除的或編譯器無法找到的模組載入符號。 可以從呼叫堆疊視窗、模組視窗、區域性變數視窗、自動視窗和所有監視視窗的快捷選單中載入符號。 如果偵錯程式在沒有可用符號或原始檔的程式碼中中斷,則將顯示一個文件視窗。 在此可以找到所缺檔案的相關資訊,並採取相應措施來查詢並載入它們。

使用未載入任何符號的文件頁查詢符號

偵錯程式可通過多種方式中斷沒有可用符號的程式碼:

  1. 單步執行程式碼。

  2. 通過斷點或異常中斷程式碼。

  3. 切換到其他執行緒。

  4. 通過在“呼叫堆疊”視窗中雙擊幀來更改堆疊幀。

出現上述事件之一時,偵錯程式將顯示“未載入任何符號”頁來幫助你查詢和載入必需的符號。


  • 若要更改搜尋路徑,請選擇未選定的路徑或選擇“新建”,然後輸入新路徑。 選擇“載入”以再次搜尋路徑,並在找到符號檔案時載入符號檔案。

  • 選擇“瀏覽並查詢 executable-name...”重寫任何符號選項並重試搜尋路徑。 如果找到符號檔案,或顯示了檔案資源管理器供你手動選擇符號檔案,則載入符號檔案。

  • 選擇“更改符號設定...”可顯示 VS“選項”對話方塊的“除錯”/“符號”頁。

  • 選擇“檢視反彙編”可在新視窗中顯示一次反彙編。

  • 若要在未找到原始檔或符號檔案的情況下始終顯示反彙編,請選擇“選項”對話方塊連結,然後選擇“啟用地址級除錯”“原始碼不可用時顯示反彙編”


從快捷選單更改符號選項

當你處於中斷模式時,可查詢並載入呼叫堆疊視窗、模組視窗、區域性變數視窗、自動視窗和所有監視視窗中顯示的項的符號。 在視窗中選擇一個項,開啟快捷選單,然後選擇下列選項之一:

選項描述
載入符號嘗試從“選項”對話方塊的“除錯”/“符號”頁上指定的位置載入符號。 如果無法找到符號檔案,則將啟動檔案資源管理器,以便你能夠指定要搜尋的新位置。
符號載入資訊顯示已載入符號檔案的位置或偵錯程式無法查詢檔案時已搜尋位置的資訊。
符號設定...開啟 VS“選項”對話方塊的“除錯”/“符號”頁。
始終自動載入將符號檔案新增到由偵錯程式自動載入的檔案列表中。

為符號檔案設定編譯器選項

當你從 VS IDE 生成專案並使用標準“除錯”生成配置時,C++ 和託管編譯器將為你的程式碼建立相應的符號檔案。 也可在命令列上設定編譯器選項以建立符號檔案。

C++ 選項

程式資料庫 (.pdb) 檔案儲存除錯和專案狀態資訊,使用這些資訊可以對程式的除錯配置進行增量連結。 使用 /ZI 或 /Zi(適用於 C/C++)生成時,將建立 .pdb 檔案。

在 Visual C++ 中,/Fd 選項命名由編譯器建立的 .pdb 檔案。 使用嚮導在 Visual Studio 中建立專案時,/Fd 選項將設定為建立一個名為 project.pdb 的 檔案 .pdb 檔案。

如果使用生成檔案生成 C/C++ 應用程式,並指定 /ZI/Zi 而不指定 /Fd,則最終將生成兩個 .pdb 檔案:

  • VCx.pdb,其中 x 表示 Visual C++ 的版本,例如 VC11.pdb。 該檔案儲存各個 OBJ 檔案的所有除錯資訊並與專案生成檔案駐留在同一個目錄中。

  • project.pdb 該檔案儲存 .exe 檔案的所有除錯資訊。 對於 C/C++,它駐留在 \debug 子目錄中。

每當建立 OBJ 檔案時,C/C++ 編譯器都會將除錯資訊合併到 VCx.pdb 中。 插入的資訊包括型別資訊,但不包括函式定義等符號資訊。 因此,即使每個原始檔都包含公共標頭檔案(如 <windows.h>),這些頭中的 typedef 也僅儲存一次,而不是儲存在每個 OBJ 檔案中。

連結器將建立 project.pdb,它包含專案的 EXE 檔案的除錯資訊。 project.pdb 檔案包含完整的除錯資訊(包括函式原型),而不僅僅是在 VCx.pdb 中找到的型別資訊。 這兩個 .pdb 檔案都允許增量更新。 連結器還在其建立的 .exe 或 .dll 檔案中嵌入 .pdb 檔案的路徑。

Visual Studio 偵錯程式使用 EXE 或 DLL 檔案中的 .pdb 檔案的路徑查詢 project.pdb 檔案。 如果偵錯程式在該位置無法找到 .pdb 檔案或者路徑無效(例如,如果專案已移至另一臺計算機),則偵錯程式將搜尋包含 EXE 的路徑以及在“選項”對話方塊(“除錯”資料夾,“符號”節點)中指定的符號路徑。 偵錯程式將不會載入與所除錯的可執行檔案不匹配的 .pdb 檔案。 如果偵錯程式無法找到 .pdb 檔案,則將顯示“查詢符號”對話方塊,這將允許你搜索符號或向搜尋路徑新增其他位置。

.NET Framework 選項

程式資料庫 (.pdb) 檔案儲存除錯和專案狀態資訊,使用這些資訊可以對程式的除錯配置進行增量連結。 使用 /debug 進行生成時,將建立一個 .pdb 檔案。 可以使用 /debug:full/debug:pdbonly 生成應用程式。 使用 /debug:full 進行生成可以生成可除錯的程式碼。 使用 /debug:pdbonly 進行生成可以生成 .pdb 檔案,但是不會生成通知 JIT 編譯器除錯資訊可用的 DebuggableAttribute。 如果想為不希望其成為可除錯的釋出版本生成 .pdb 檔案,請使用 /debug:pdbonly。 有關詳細資訊,請參閱/debug (Emit Debugging Information)/debug

Visual Studio 偵錯程式使用 EXE 或 DLL 檔案中的 .pdb 檔案的路徑查詢 project.pdb 檔案。 如果偵錯程式無法在該位置找到.pdb 檔案,或者該路徑無效,偵錯程式將先搜尋包含 EXE 的路徑,然後搜尋“選項”對話方塊中指定的符號路徑。 該路徑通常是“符號”節點中的“除錯”資料夾。 偵錯程式將不會載入與所除錯的可執行檔案不匹配的 .pdb 檔案。 如果偵錯程式無法找到 .pdb 檔案,則將顯示“查詢符號”對話方塊,這將允許你搜索符號或向搜尋路徑新增其他位置。

Web 應用程式

一定要把你的應用程式配置檔案 (Web.config) 設為除錯模式。 除錯模式將導致 ASP.NET 為動態生成的檔案生成符號,並允許偵錯程式附加到 ASP.NET 應用程式。 如果專案是通過 Web 專案模板建立的,則 VS 會在你開始除錯時自動完成此設定。

查詢原始檔

偵錯程式搜尋原始檔的位置

偵錯程式在下列位置查詢原始檔:

  1. 在啟動偵錯程式的 Visual Studio 例項的 IDE 中開啟的檔案。

  2. 在 Visual Studio 例項中開啟的解決方案中的檔案。

  3. 在解決方案的屬性中的“公共屬性”/“除錯原始檔”頁中指定的目錄。 (在“解決方案資源管理器”中,選擇該解決方案節點,右鍵單擊,然後選擇“屬性”。 )

  4. 模組的 .pdb 的源資訊。 這可能是生成模組時原始檔的位置,也可能是源伺服器的命令。

使用“無源”/“未載入任何符號”頁查詢並載入原始檔

當偵錯程式在原始檔不可用的位置中斷執行時,它將顯示“未載入任何源”“未載入任何符號”頁,這些頁可幫助你查詢原始檔。 當偵錯程式無法找到可執行檔案的符號 (.pdb) 檔案來完成搜尋時,將顯示“未載入任何符號”。 “無符號”頁將提供用於搜尋檔案的選項。 如果在執行選項之一後找到 .pdb,並且偵錯程式可以使用符號檔案中的資訊檢索原始檔,則將顯示源。 否則,將顯示描述問題的“未載入任何源”頁。 此頁將顯示選項鍊接,這些連結可執行可以解決問題的操作。

將原始檔搜尋路徑新增到解決方案

你可指定網路或本地目錄來搜尋原始檔。

  1. 在解決方案資源管理器中選擇解決方案,然後從快捷選單中選擇“屬性”

  2. “公共屬性”節點下,選擇“除錯原始檔”

  3. 單擊資料夾 工具/ 選項/ 除錯/符號資料夾圖示 圖示。 可編輯文字將顯示在“包含原始碼的目錄”列表中。

  4. 新增要搜尋的路徑。

請注意,只搜尋指定的目錄。 你必須為要搜尋的任何子目錄新增項。

使用源伺服器

如果本地計算機上沒有原始碼,或者 .pdb 檔案與原始碼不匹配,則可使用源伺服器來幫助除錯應用程式。 源伺服器接受檔案請求並返回實際的檔案。 源伺服器通過名為 srcsrv.dll 的 DLL 檔案執行。 源伺服器讀取應用程式的 .pdb 檔案,該檔案包含指向原始碼儲存庫的指標,以及用於從該儲存庫檢索原始碼的命令。 你可以限制允許從應用程式的 .pdb 檔案執行的命令,方法是在名為 srcsrv.ini 的檔案內列出允許的命令,該檔案必須與 srcsrv.dll 和 devenv.exe 位於同一個目錄中。

System_CAPS_ICON_important.jpg 重要事項

任意命令都可嵌入應用程式的 .pdb 檔案中,因此請確保在 srcsrv.ini 檔案中僅放入要執行的命令。 任何嘗試執行不在 srcsvr.ini 檔案中的命令都將導致出現一個確認對話方塊。 有關更多資訊,請參見安全警告:偵錯程式必須執行不受信任的命令。 未對命令引數執行任何驗證,因此請慎用受信任的命令。 例如,如果你信任 cmd.exe,惡意使用者則可能會指定使該命令變得危險的引數。

啟用源伺服器的使用

  1. 確保你在編譯時採用了上一節中介紹的安全措施。

  2. “工具”選單上,選擇“選項”

    這將顯示“選項”對話方塊。

  3. “除錯”節點下,選擇“常規”

  4. 選擇“啟用源伺服器支援”複選框。


  5. (可選)選擇所需的子選項。

    請注意,“允許源伺服器中的部分信任程式集(僅限託管)”“始終執行不受信任的源伺服器命令並且不再提示”都會增大上述安全風險。

請參閱