您可以在開發期間,使用下列設定來偵錯 User-Mode Driver Framework (UMDF) 驅動程式。 所有設定都牽涉到兩部機器、一部主機和一個目標。
- 手動將驅動程式複製到目標。 在目標上執行使用者模式偵錯。 在此情境中,您會手動連接到在目標上執行的驅動程式主機程序實例。
- 手動將驅動程式複製到目標,然後從主機執行內核模式偵錯。
我們建議在進行所有 UMDF 驅動程式的測試和開發時,使用已附加的核心除錯程式。
最佳做法
我們建議使用連結的核心調試程序執行所有UMDF驅動程序測試。
以下是建議的設定。 您可以手動設定這些設定,或使用 WDK 中的 WDF 驗證器控制應用程式 (WDFVerifier.exe) 工具來檢視或變更這些設定。
在 WUDFHost.exe上啟用應用程式驗證器:
AppVerif –enable Heaps Exceptions Handles Locks Memory TLS Leak –for WudfHost.exe
如果發生例外狀況,應用程式驗證器會將診斷訊息傳送至偵錯器並停止程式執行。
如果您使用內核模式除錯會話,請設定 HostFailKdDebugBreak,使反映器在終止驅動程式主機進程之前中斷進入內核模式除錯器。 從 Windows 8 開始,預設會啟用此設定。
將 UmdfHostProcessSharing 設定為 ProcessSharingDisabled 來停用共用。 如需詳細資訊,請參閱 在 INF 檔案中指定 WDF 指示詞。
根據預設,當 UMDF 裝置失敗時,架構會嘗試將它重新啟動最多五次。 您可以將 DebugModeFlags 設定為 0x01,以關閉自動重新啟動。 如需詳細資訊,請參閱 偵錯 WDF 驅動程式的登錄值。
重新啟動電腦。
若要偵錯 UMDF 驅動程式問題,請檢閱 判斷反映器為何終止主機進程 並 偵錯 UMDF 驅動程式當機
使用 WinDbg 手動附加 (使用者模式偵錯)
在目標電腦上,您可以手動將 WinDbg 附加至裝載驅動程式的 WUDFHost 實例。 當您連接時,您會進入調試程式,以便於在驅動程式中設定斷點。
由於驅動程式初始化會在 WUDFHost 載入之後不久發生,因此無法及時手動附加以偵錯初始化程序代碼。 相反地,您可以設定登錄值,讓主機進程在主機初始化或驅動程式載入時間等候一些秒數。 此延遲可讓您有時間將 WinDbg 附加至 WUDFHost 進程的正確實例。
請遵循下列步驟:
- 在目標電腦上的登錄中,將 HostProcessDbgBreakOnStart 或 HostProcessDbgBreakOnDriverLoad 設定為一些秒數並重新啟動。
- 在目標計算機上,以系統管理員身分開啟 WinDbg。
- 在 [ 檔案] 功能表上,選擇 [ 附加至進程]。 選取 [依可執行檔],並找出所有名為 WUDFHost.exe 的進程(可能沒有任何)。 如果有任何名為 WUDFHost.exe的進程,請記下其進程標識碼以供日後參考。
- 在設備管理員中,啟用驅動程式。
- 重複步驟 2,並找出 WUDFHost.exe的新實例。 如果您沒有看到新的 WUDFHost.exe實例,請按兩下 [ 取消],然後選擇 [ 附加至進程 ]。 當您找到新的 WUDFHost.exe實例時,請選取它,然後按兩下 [ 確定]。
如果 裝置共用 正在使用中,而且您設定 HostProcessDbgBreakOnDriverLoad 登錄值,您可能會看到調試程式因其他驅動程式載入而中斷。 您可以使用 UMDF 偵錯模式來關閉裝置共用。
若要使用偵錯模式,請使用 Visual Studio 中的 F5 選項,或在登錄中設定 DebugModeFlags 和 DebugModeBinaries 值。
如需 UMDF 登錄值的詳細資訊,請參閱偵錯 WDF 驅動程式的登錄值(KMDF 和 UMDF)。
使用 WinDbg 從主電腦遠端偵錯 (內核模式偵錯)
從遠端主機建立內核模式偵錯會話,然後將目前的進程設定為裝載驅動程式的 Wudfhost 實例。 如果您從遠端核心偵錯工具進行偵錯,您可以將 HostProcessDbgBreakOnDriverStart 或 HostProcessDbgBreakOnDriverLoad 設定為 0x80000000,以取消逾時,並進入核心偵錯工具。
採取以下步驟:
停用共用。 開啟 DebugModeFlags 並在DebugModeBinaries 中列出您的驅動程式
如果您的驅動程式使用 UMDF 1.11 或更新版本,則預設會啟用 HostFailKdDebugBreak 。 略過此步驟。
如果您的驅動程式使用 UMDF 1.9 或更早版本,請將 HostFailKdDebugBreak 設定為 1。
如果您要偵錯與逾時相關的問題,請關閉 HostProcessDbgBreakOnDriverStart 和 HostProcessDbgBreakOnDriverLoad。 (當 HostProcessDbgBreakOnDriverStart 或 HostProcessDbgBreakOnDriverLoad 非零時,框架將停用超時,這樣在使用者模式偵錯程式附加至主機進程時,反射器不會終止主機。如果您需要偵錯驅動程式初始化代碼,不要使用這兩個值,請嘗試在驅動程式載入之前在 WinDbg 中發出以下命令:sxe ld:MyDriver.dll (在模組載入時中斷)
如果您進行任何登錄變更,請重新啟動。
根據您上述所做的選擇,遠端內核調試器應該會在驅動程式在目標上載入或卸載時中斷。