使用 Framework 的事件記錄器
WDF 包含內部追蹤記錄器,有時稱為架構的內部追蹤 記錄 器 (IFR) 。 WDF 記錄器會建立追蹤記錄,其中包含每個 WDF 驅動程式事件的最新歷程記錄。 追蹤記錄會追蹤透過架構的 I/O 要求封包進度, (IRP) ,以及透過驅動程式的對應要求。 每個 Kernel-Mode Driver Framework (KMDF) 和 User-Mode Driver Framework (UMDF) 驅動程式都有自己的記錄檔。
WDF 記錄器一律會啟用。 針對每個追蹤記錄檔,記錄器會將事件記錄儲存在迴圈記憶體緩衝區中。 您可以選擇性地開啟詳細資訊,這會導致事件記錄器記錄其他資訊,以協助您偵錯驅動程式,例如進入或結束內部程式碼路徑的專案。 根據預設,緩衝區的大小是一個記憶體頁面,並關閉詳細資訊。 您可以在 WdfVerifier 應用程式中調整這些值,以變更緩衝區的大小和詳細資訊。 請注意,開啟詳細資訊可能會降低系統效能。
您可以使用 WDF 偵錯工具延伸模組,在互動式偵錯期間檢視及儲存 WDF 記錄。 若要在偵錯會話期間檢視 WDF 記錄:
載入正確的符號。 您可以使用 .symfix+ 偵錯工具命令,將 Microsoft 公用符號存放區附加至現有的符號路徑。 公用符號存放區包含 WDF 二進位檔的符號。 您也可以載入驅動程式符號的符號。
如需如何取得視窗符號以及如何設定偵錯工具符號路徑的其他資訊,請參閱 Windows 偵 錯套件所提供的檔。
將 Wdfkd.dll 延伸模組程式庫 載入偵錯工具。 如果您使用核心偵錯工具,您可以使用 .load 命令來執行此動作。 若要載入正確的版本 Wdfkd.dll 您必須指定 DLL 的完整路徑。 例如,您會在 x86 型偵錯工具主機電腦上使用下列路徑:
.load "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\winext\wdfkd.dll"
然後,您可以使用 !chain 命令來顯示所有已載入的延伸模組,以確認延伸模組已載入。
如需架構偵錯工具延伸模組的詳細資訊,請使用 !wdfhelp 延伸模組。 如需核心偵錯工具的詳細資訊,請參閱 Windows 偵 錯套件所提供的檔。
如果您的驅動程式使用架構 1.11 版或更新版本,而且您使用的是Windows 8或更新版本的核心偵錯工具,您可以略過此步驟。
如果您的驅動程式使用早于 1.11 的架構版本,請使用 !wdftmffile 或 !wdfsearchpath 來指定平臺特定的追蹤訊息格式 (.tmf) 檔案,或 .tmf 檔案的路徑。 .tmf 檔案位於 WDK 的平臺特定子目錄中。
因為 .tmf 檔案是特定版本,所以您必須指定對應至目前執行之架構執行時間程式庫版本的 .tmf 檔案。 例如,如果 KMDF 1.9 版是在主機電腦上執行:
!wdftmffile c:\WinDDK\<version>\tools\tracing\x86\wdf01009.tmf
您也可以藉由設定TRACE_FORMAT_SEARCH_PATH環境變數來設定搜尋路徑。 !wdftmffile命令優先于環境變數所設定的搜尋路徑。
若要驗證架構版本號碼,您可以從核心偵錯工具執行 !wdfldr 偵錯工具擴充功能命令。
使用 !wdflogdump 延伸模組來顯示事件記錄器的記錄。 例如,WinDbg 命令視窗的下列螢幕擷取畫面顯示 !wdflogdump輸出的一般範例:
架構記錄中的每個行前面都會加上稱為 追蹤訊息前置詞的字串。 追蹤記錄器會在寫入記錄的每個訊息前面加上此前置詞。 根據預設,前置詞包含一組標準資料元素,但您可以變更預設元素以符合您的特定需求。 您可以藉由設定TRACE_FORMAT_PREFIX環境變數或使用 !wdfsettraceprefix 偵錯工具擴充命令來變更 WDF 驅動程式的前置詞字串。
若要設定環境變數,請使用類似下列的命令:
Set TRACE_FORMAT_PREFIX=%2!s!: %!FUNC!: %8!04x!.%3!04x!: %4!s!:
此命令會將追蹤訊息前置詞設定為下列專案:
SourceFile_LineNumber: FunctionName: ProcessID.ThreadID: SystemTime
您也可以使用 !wdflogsave 擴充功能命令,將事件記錄器記錄儲存在事件追蹤記錄檔 (.etl) 檔案中,您可以使用 TraceView檢視。
您有時可以在損毀傾印上使用 !wdfcrashdump 偵錯工具延伸模組,在系統錯誤檢查之後顯示記錄資訊。 只有在架構可以判斷驅動程式造成錯誤檢查,或您已設定驅動程式的 ForceLogsInMiniDump 登錄值時,才會在損毀傾印中取得記錄資訊。
如果在錯誤檢查發生時附加偵錯工具,您可以使用 !wdfcrashdump 立即檢視記錄資訊,也可以載入記憶體傾印檔案來檢視資訊。 由於小型記憶體傾印檔案的大小限制,導致損毀的驅動程式記錄可能不會出現在傾印中。
架構可以判斷特定驅動程式是否造成下列錯誤檢查碼:
- 錯誤檢查0xD1:DRIVER_IRQL_NOT_LESS_OR_EQUAL
- 錯誤檢查0xA:IRQL_NOT_LESS_OR_EQUAL
- 錯誤檢查0x20:KERNEL_APC_PENDING_DURING_EXIT
- 錯誤檢查0x8E:KERNEL_MODE_EXCEPTION_NOT_HANDLED
- 錯誤檢查0x1E:KMODE_EXCEPTION_NOT_HANDLED
- 錯誤檢查0x50:PAGE_FAULT_IN_NONPAGED_AREA
- 錯誤檢查0x7E:SYSTEM_THREAD_EXCEPTION_NOT_HANDLED
從 UMDF 第 2 版開始,UMDF 會將 UMDF 追蹤記錄 (或 UMDF IFR) 儲存在核心非分頁式記憶體中。 架構會為每個驅動程式主機配置一個 IFR, (Wudfhost) 實例。
如需偵錯工具擴充功能命令的詳細資訊,請參閱 Framework 型驅動程式的偵錯工具延伸模組。