在 Visual Studio 2010 中除錯呼叫 API 時,回傳控制碼為 NULL,GetLastError() 回傳 126 (ERROR_MOD_NOT_FOUND)。輸出視窗大量顯示:
'Loaded C:\Windows\System32\ntdll.dll', Cannot find or open the PDB file
'Loaded C:\Windows\System32\kernel32.dll', Cannot find or open the PDB file
...
PDB (Program Database) 是偵錯符號檔。系統 DLL (ntdll.dll, kernel32.dll 等) 的 PDB 檔預設不在專案目錄,VS 找不到時會輸出此訊息。這只是警告,不代表程式錯誤。真正導致 LoadLibrary 失敗 (錯誤 126) 的原因通常是:
DllMain 失敗C:\Symbols).exe此模式不載入符號,不會顯示 PDB 警告,能快速確認程式邏輯是否正常。
exe 同目錄 / 系統目錄 / PATH 目錄。HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\your.exe 新增 GlobalFlag = 0x00000040,重新除錯查看詳細載入日誌。| 現象 | 是否為錯誤 | 處理建議 |
|---|---|---|
| 輸出視窗出現 "Cannot find PDB" | 否 (警告) | 啟用 Symbol Server 或忽略 |
| LoadLibrary 回傳 NULL, GetLastError=126 | 是 | 檢查路徑、位元數、相依性 |
| 程式在系統 DLL 內崩潰 | 是 | 需系統符號分析堆疊,啟用 Symbol Server |
核心觀念:「Cannot find PDB」≠ 程式錯誤。它只是說「沒有這個 DLL 的原始碼行號資訊」。專注解決
GetLastError()回傳的真實錯誤碼,才是除錯正道。