影片:使用 WDF 原始程式碼對驅動程式進行偵錯

本主題包含影片教學課程,示範如何偵錯 Windows Driver Frameworks (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 核心偵錯工作階段、中斷並遵循下列步驟:

  1. 使用 .symfix 設定預設符號路徑。 這會設定指向 位於 https://msdl.microsoft.com/download/symbols之符號伺服器的符號路徑。

    kd> .symfix

  2. 使用 .srcfix 設定預設來源路徑。 這會設定 srv*的來源路徑,這會告訴調試程式從目標模組符號檔中指定的位置擷取來源檔案。

    kd> .srcfix
    Source search path is: SRV*
    
  3. 使用 .reload 重載符號,並確認 UMDF) (或 Wudfx02000.dll Wdf01000.sys 符號已編製索引。 如下面 !lmi 的輸出所示,PDB Wdf01000.sys 已編製來源索引。 如果不是,請參閱下方的 WinDbg 安裝程式一節。

    kd> .reload
    ...
    
    kd> !lmi wdf01000.sys
    Loaded Module Info: [wdf01000.sys] 
    ...
    Load Report: private symbols & lines, source indexed 
    C:\...\Wdf01000.pdb\...\Wdf01000.pdb
    
  4. 現在您已設定好! 逐步執行 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 發送器和探索後續程式代碼路徑等核心函式上設定斷點來深入瞭解架構內部。