本主題包含影片教學課程,示範如何使用 WDF 原始程式碼的完整存取權來偵錯 Windows 驅動程式架構 (WDF) 驅動程式。 影片後面是影片中遵循的逐步步驟,方便參考。
WDF 原始碼偵錯可讓您自由逐步執行 WDF 框架程式碼,無需下載 WDF 原始程式碼。 偵錯工具會自動從 GitHub 下載正確版本的 WDF。
例如,如果您使用 WinDbg 在 Windows 10 計算機上偵錯 WDF 驅動程式,而且偵錯工具已與呼叫堆疊中的架構程式碼分開,您可以按兩下 [呼叫堆疊] 檢視中的 WDF 框架,WinDbg 會自動下載並開啟相符行的相關 WDF 來源檔案。 然後,您可以逐步執行程式碼並設定中斷點。
此功能適用於執行 Windows 10 公開版本,Technical Preview 組建 10041 或更新版本的目標系統。 這些組建具有 KMDF (Wdf01000.sys) 和 UMDF (Wudfx02000.dll) 的私人來源索引符號檔,可在 Microsoft 公用符號伺服器上使用。 WDF 程式碼的來源層級偵錯僅適用於 WinDbg,而無法在 Visual Studio 偵錯工具中使用。
快速入門
啟動目標計算機的 WinDbg 核心偵錯會話、中斷,然後遵循下列步驟:
使用 .symfix 設定預設符號路徑。 這會將符號路徑設定為指向位於 的符號伺服器 https://msdl.microsoft.com/download/symbols。
kd> .symfix使用 .srcfix 設定預設來源路徑。 這會將來源路徑設定為 srv*,這會告知偵錯工具從目標模組符號檔中指定的位置擷取來源檔。
kd> .srcfix Source search path is: SRV*使用 .reload 重新載入符號,並確認 Wdf01000.sys 符號 (或 UMDF 的 Wudfx02000.dll) 已建立來源索引。 如下列 !lmi 的輸出所示,Wdf01000.sys PDB 會以來源編製索引。 如果您的不是,請參閱下方的 WinDbg 安裝程式一節。
kd> .reload ... kd> !lmi wdf01000.sys Loaded Module Info: [wdf01000.sys] ... Load Report: private symbols & lines, source indexed C:\...\Wdf01000.pdb\...\Wdf01000.pdb這樣就一切就緒了! 逐步執行 WDF 原始程式碼的簡單方法是在架構的 IRP 分派常式上設定中斷點,然後逐步執行程式碼的其餘部分。 由於 Windows 系統有許多收件匣 KMDF 驅動程式,因此 WDF 總是已載入且正在執行,因此會立即觸發此中斷點,而不需要載入您自己的驅動程式。
kd> bp Wdf01000!FxDevice::DispatchWithLock kd> g Breakpoint 0 hit Wdf01000!FxDevice::DispatchWithLock: 87131670 8bff mov edi,edi
如果這不起作用,請查看下面的 WinDbg 安裝步驟。
WinDbg 設定
如果上述範例未如預期般運作,您可能需要執行下列一或多個指示。
啟用來源模式偵錯
請確定已啟用 來源模式中的偵錯 。 開啟「偵錯」功能表,並確認已勾選「來源模式」。
清除過時的符號快取
如果您先前針對相同的 Windows 目標偵錯 WDF 驅動程式,則您可能會使用未編製來源索引的本機快取 WDF 符號。 您可以使用 !lmi 命令檢查這一點:
kd> !lmi Wdf01000.sys
Loaded Module Info: [wdf01000.sys]
...
Load Report: private symbols & lines, not source indexed
C:\...\Wdf01000.pdb\...\Wdf01000.pdb
根據上述負載報告,Wdf01000.pdb 未建立來源索引。 這表示您的本機 WinDbg 符號快取已過時。 若要修正此問題,請從 WinDbg 卸載 PDB、清除本機快取 (您的路徑可能會根據上述 !lmi 輸出而有所不同),然後重新載入 PDB:
kd> .reload /u Wdf01000.sys
CMD> del
C:\...\Wdf01000.pdb\...\Wdf01000.pdb
kd> .reload Wdf01000.sys
現在運行 !lmi 再次檢查:PDB 應該顯示為源索引,並且應該彈出一個源代碼窗口。
kd> !lmi Wdf01000.sys
Loaded Module Info: [wdf01000.sys]
...
Load Report: private symbols & lines, source indexed
C:\...\Wdf01000.pdb\...\Wdf01000.pdb
您可以使用 WDF 原始碼層級偵錯,不僅可以用來進行即時偵錯和分析當機傾印,還可以透過在核心函式(如 IRP 調度器)上設置中斷點,探索後續的代碼路徑,以更深入瞭解框架內部。