共用方式為


在 KMDF 和 UMDF 2 驅動程式中使用 Inflight Trace Recorder (IFR)

從 Windows 10 開始,您可以建置 KMDF 或 UMDF 驅動程式,以便透過 Windows 軟體追蹤前置處理取得額外的驅動程式偵錯資訊。 此功能稱為 Inflight Trace Recorder (IFR),從 KMDF 1.15 版和 UMDF 2.15 版開始提供。

Inflight Trace Recorder 是 WPP 軟體追蹤延伸模組。 不同於 WPP 追蹤,Inflight 追蹤錄製器會繼續運作,而不需要附加的追蹤取用者。 架構會將訊息寫入循環緩衝區,而您的驅動程式也可以新增自己的訊息。 每個驅動程式都有自己的記錄檔,因此與驅動程式相關聯的多個裝置會共用單一記錄。

如果您在驅動程式二進位檔中開啟 IFR,則 IFR 會出現並在驅動程式存留期間執行。 您不需要啟動明確的追蹤收集工作階段。

記錄會儲存在無法分頁的記憶體中,因此可在系統損毀之後復原。 此外,除了責任驅動程式未確定或當機是主機逾時時,小型傾印檔案中會包含 Inflight Trace Recorder 記錄檔。

如何啟用 Inflight 追蹤錄製器,並從驅動程式傳送訊息

  1. 在 Microsoft Visual Studio 中,執行下列步驟:

    • 開啟驅動程式專案的 [屬性頁]。 以滑鼠右鍵按兩下 方案總管中的驅動程式項目,然後選取 [屬性]。 在驅動程式的 [屬性頁] 中,選取 [組態屬性],然後選取 [Wpp 追蹤]。 在 [一般] 功能表上,將 [執行 WPP 追蹤] 設定為 []。

    • 流覽至 Properties-Wpp> 追蹤函>式和宏選項,然後選擇 [啟用 WPP 錄製器]。

    • 在相同的功能表上,將 [掃描組態數據] 設定為包含追蹤信息的檔案,例如 Trace.h。

  2. 在每個呼叫 WPP 宏的來源檔案中,新增可識別追蹤訊息標頭 (TMH) 檔案的 #include 指示詞。 檔名的格式必須是 <driver-source-file-name.tmh。>

    例如,如果您的驅動程式包含兩個原始程式檔,稱為 MyDriver1.cMyDriver2.c,則 MyDriver1.c 必須包含:

    #include “MyDriver1.tmh”

    MyDriver2.c 必須包含:

    #include “MyDriver2.tmh”

    當您在 Visual Studio 中建置驅動程式時,WPP 預處理器會產生 。tmh 檔案。

  3. 在頭檔中定義WPP_CONTROL_GUIDS宏。 此宏會定義驅動程序追蹤訊息的 GUID 和 追蹤旗標

    Osrusbfx2 驅動程式範例會定義 Trace.h 頭檔中的單一控件 GUID 和七個追蹤旗標,如下列範例所示:

    #define WPP_CONTROL_GUIDS \
    WPP_DEFINE_CONTROL_GUID(OsrUsbFxTraceGuid, \
      (d23a0c5a,d307,4f0e,ae8e,E2A355AD5DAB), \
      WPP_DEFINE_BIT(DBG_INIT)          /* bit  0 = 0x00000001 */ \
      WPP_DEFINE_BIT(DBG_PNP)           /* bit  1 = 0x00000002 */ \
      WPP_DEFINE_BIT(DBG_POWER)         /* bit  2 = 0x00000004 */ \
      WPP_DEFINE_BIT(DBG_WMI)           /* bit  3 = 0x00000008 */ \
      WPP_DEFINE_BIT(DBG_CREATE_CLOSE)  /* bit  4 = 0x00000010 */ \
      WPP_DEFINE_BIT(DBG_IOCTL)         /* bit  5 = 0x00000020 */ \
      WPP_DEFINE_BIT(DBG_WRITE)         /* bit  6 = 0x00000040 */ \
      WPP_DEFINE_BIT(DBG_READ)          /* bit  7 = 0x00000080 */ \
    )
    

    在此範例中:

    • OsrUsbFxTraceGuid 是 {d23a0c5a-d307-4f0e-ae8e-E2A355AD5DAB} GUID 的易記名稱。
    • 追蹤旗標可用來區分當驅動程序處理不同類型的 I/O 要求時產生的追蹤訊息。
  4. 您的驅動程式 (KMDF 和 UMDF 2) 必須針對具有驅動程式對象和登錄路徑的核心模式驅動程式呼叫 WPP_INIT_TRACING,通常是來自 DriverEntry:

    WPP_INIT_TRACING( DriverObject, RegistryPath );
    

    若要停用追蹤,KMDF 和 UMDF 2 驅動程式都會從 EvtCleanupCallbackEvtDriverUnload 呼叫核心模式驅動程序WPP_CLEANUP:

    WPP_CLEANUP( WdfDriverWdmGetDriverObject( Driver ));
    

    WPP_CLEANUP宏會採用類型為 PDRIVER_OBJECT 的參數,因此如果驅動程式的 DriverEntry 失敗,您可以略過呼叫 WdfDriverWdmGetDriverObject,而改為使用 WDM 驅動程式物件的指標呼叫WPP_CLEANUP。

    由於UMDF驅動程式會使用這些宏的核心模式簽章來初始化和清除追蹤,因此呼叫看起來與 KMDF 和 UMDF 相同。

  5. 在驅動程式中使用 DoTraceMessage 宏或自定義版本的宏來建立追蹤訊息。

    下列範例示範 Osrusbfx2 驅動程式如何使用其 TraceEvents 函 式,在專門處理讀取要求的一部分程式碼中:

    if (Length > TEST_BOARD_TRANSFER_BUFFER_SIZE) {
        TraceEvents(TRACE_LEVEL_ERROR,
                    DBG_READ,
                    "Transfer exceeds %d\n",
                    TEST_BOARD_TRANSFER_BUFFER_SIZE);
    
        status = STATUS_INVALID_PARAMETER;
    }
    

    如果追蹤控制器啟用TRACE_LEVEL_ERROR層級和DBG_READ追蹤旗標,則 TraceEvents 的呼叫會產生追蹤訊息。 訊息包含驅動程式定義常數 的值TEST_BOARD_TRANSFER_BUFFER_SIZE

  6. 若要變更驅動程式記錄檔所使用的循環緩衝區大小,請修改 下列登錄位置中的 LogPages 登錄值:

    針對UMDF:

    SOFTWARE\Microsoft\Windows NT\CurrentVersion\WUDF\Services\<YourDriver>\Parameters\Wdf

    針對 KMDF:

    HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\<YourDriver>\Parameters\Wdf

    這是類型 為 REG_DWORD 的值,其中包含分頁中配置的記錄緩衝區大小。 有效值介於 0x1 和 0x10 之間。

適用於 KMDF 驅動程式

  1. 在調試程式中輸入 .load rcdrkd.dll ,以載入 RCDRKD 命令。
  2. 使用 !wdfkd.wdfldr 延伸模組來顯示目前動態系結至 Windows Driver Frameworks (WDF) 之驅動程式的相關信息。
  3. 使用 !rcdrkd.rcdrlogdump 和 !rcdrkd.rcdrcrashdump 來檢視驅動程式所提供的訊息。
  4. 使用 !wdfkd.wdflogdump!wdfkd.wdfcrashdump 來查看架構所提供的訊息。

UMDF 驅動程式的即時偵錯

  1. 使用 !wdfkd.wdfldr 延伸模組來顯示目前動態系結至 WDF 之驅動程式的相關信息。 尋找您的使用者模式驅動程式。 輸入相關聯的主機進程。

  2. 輸入 !wdfkd.wdflogdump< YourDriverName.dll<>Flag ,其中< Flag>> 為:

    • 0x1 – 合併架構和驅動程序記錄
    • 0x2 – 驅動程序記錄
    • 0x3 – 架構記錄

    如果指定的驅動程式沒有驅動程序記錄檔,擴充功能只會顯示架構記錄檔。

在 UMDF 驅動程式當機後檢視 Inflight 追蹤錄製器記錄檔

  1. 從 WinDbg 中,選取 [ 檔案開啟>損毀傾印],並指定您想要偵錯的小型傾印檔案。

  2. 輸入 !wdfkd.wdfcrashdump <YourDriverName.dll<>驅動程式主機<>選項的進程標識符,其中 <Option>> 為:

    • 0x1 – 合併架構和驅動程序記錄
    • 0x2 – 驅動程序記錄
    • 0x3 – 架構記錄

    如果您未指定驅動程式, !wdfcrashdump 會顯示所有驅動程序的資訊。 如果您未指定主機進程,而且只有一個,擴充功能會使用單一主機進程。 如果您未指定主機進程且有多個,擴充功能會列出作用中的主機進程。

    如果儲存在迷你傾印中的記錄資訊不符合輸入的名稱,則小型傾印不包含驅動程式的記錄檔。

如果您沒有連線調試程式,您仍然可以存取驅動程式和架構記錄。 若要瞭解如何,請參閱 影片:在沒有調試程序的情況下存取驅動程式 IFR 記錄。

如需將追蹤訊息新增至驅動程式的詳細資訊,請參閱 將WPP宏新增至驅動程式

如何啟用 UMDF 驅動程式的偵錯

RCDRKD 延伸模組

使用架構的事件記錄器

在 UMDF 驅動程式中使用 WPP 軟體追蹤