什麼是符號檔案?
符號檔案(Symbol Files,副檔名 .pdb)包含應用程式二進制檔(EXE/DLL)的偵錯資訊:全域/區域變數、函數名與進入點位址、FPO(幀指標省略)資料、原始碼行號對應。執行檔運行不需 PDB,但偵錯時不可或缺。PDB 與編譯版本強綁定,原始碼變更重編後必須使用新 PDB。
取得與安裝系統符號檔
- 確認作業系統版本(含 Service Pack)。
- 從 Microsoft 符號伺服器下載對應 PDB。
- 安裝路徑任意,但宿主機(偵錯端)的符號必須與目標機(被偵錯端)的 OS 版本完全匹配。
- 設定環境變數
_NT_SYMBOL_PATH 或在偵錯工具中指定路徑,讓 VC++/WinDBG/NTSD/DrWatson 能找到符號。
Visual C++ 設定符號路徑
VC++ 6.0
- Tools → Options → Directories
- 「Show directories for」選 Executable files
- 將 PDB 目錄加入列表
VC++ .NET 2003
- 方案總管右鍵專案 → Properties
- Configuration Properties → Debugging
- 在 Symbol Path 加入路徑
產生 Release 版 PDB(可偵錯的優化版本)
VC++ 6.0
- Project → Settings,選 Release 組態
- C/C++ → General → Debug info:選 Program Database(或 C7 compatible)
- Link → Debug:勾選 Generate debug info,選 Default 或 Full
- Link → General → Project Options 末尾加入:
/opt:ref,icf
- Rebuild All
VC++ .NET 2003
- 專案屬性 → C/C++ → General → Debug Information Format:Program Database (/Zi)
- Linker → Debugging → Generate Debug Info:Yes (/DEBUG)
- Linker → Command Line → Additional Options:加入
/opt:ref,icf
- Rebuild
Free Build vs Checked Build
| Free Build (Retail) | Checked Build (Debug) |
| 目的 | 最終用戶版本 | 測試/偵錯版本 |
| 優化 | 徹底優化,移除斷言與偵錯資訊 | 保留錯誤檢查、參數驗證、偵錯資訊 |
| 體積/速度 | 較小、載入快、記憶體少 | 較大、較慢、佔用更多資源 |
| 偵錯體驗 | 無符號資訊,難以偵錯 | 完整符號,易於隔離問題 |
系統符號自動更新(WinDBG)
在 WinDBG Symbol Path 設定:
SRV*D:\Symbols\websymbols*https://msdl.microsoft.com/download/symbols
(斜體為本地快取路徑)
- 直連網路:開啟偵錯目標後輸入
.symfix 或 symchk,自動下載匹配 PDB 至本地快取。
- 代理上網:需先設定 IE 連線代理。
此法確保本地符號與當前系統檔案版本始終一致,免去手動下載安裝之苦。
總結
PDB 是偵錯的「地圖」。正確產生、管理、匹配符號檔案,是從崩潰位址還原原始碼行號、檢視變數值、追蹤呼叫堆疊的前提。Release 版生成 PDB 結合優化選項,可兼顧效能與可偵錯性;善用 Microsoft 符號伺服器自動同步系統符號,則是核心模式與跨機器偵錯的必備技能。