在 Visual Studio 調試器中指定符號 (.pdb) 和源文件


原文微軟官方地址:https://technet.microsoft.com/zh-cn/library/ms241613.aspx

發布日期: 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. (可選)選擇所需的子選項。

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

Visual Studio 2012 和 2013 中的 .NET 遠程符號加載更改


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM