共用方式為


偵錯 WDF 中的電源參考流失

當 Windows 驅動程式架構 (WDF) 驅動程式呼叫 WdfDeviceStopIdle時,架構會遞增裝置的電源參考計數。 對 WdfDeviceStopIdle 的每個成功呼叫都必須與 呼叫 WdfDeviceResumeIdle 進行比對,以遞減電源參考計數。

從 Kernel-Mode Driver Framework (KMDF) 1.15 和 User-Mode Driver Framework (UMDF) 2.15 開始,您可以使用 !wdfkd.wdfdevice!wdfkd.wdftagtracker 偵錯工具延伸模組來監視電源參考使用量。 基於效能考慮,此功能預設為停用,因此您必須使用 WdfVerifier 應用程式或手動編輯驅動程式的服務金鑰來開啟此功能。

WdfVerifier

開啟驅動程式的設定清單,然後以滑鼠右鍵按一下 TrackPower 設定。 選擇適合您案例的選項。

提示 避免在效能關鍵性程式碼路徑中擷取堆疊追蹤。

在 WdfVerifier 中設定追蹤電源參考的螢幕擷取畫面。

編輯登錄

您也可以編輯驅動程式的服務金鑰來開啟驗證器支援和電源參考追蹤。

針對 KMDF 驅動程式:

HKLM\SYSTEM\ControlSet001\Services\ < Driver Service Name > \Parameters\Wdf

針對 UMDF 驅動程式:

HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\WUDF\Services\ < Driver Service Name > \Parameters\Wdf

(REG_DWORD) VerifierOn = 0x1
(REG_DWORD) TrackPower = 0x0 (disabled)
                       = 0x1 (capture tick count, file name, line number)
                       = 0x2 (capture tick count, file name, line number, and stack traces)

驅動程式程式碼

驅動程式會呼叫 WdfDeviceStopIdleWdfDeviceResumeIdle 來管理裝置的工作電源狀態,如下所示:

//
// Take power reference
//
status = WdfDeviceStopIdle(device, FALSE);
if (NT_SUCCESS(status)) {
    //
    // Release power reference
    //
    WdfDeviceResumeIdle(device);
}

使用 WdfKd 進行偵錯

若要顯示裝置上所採取的電源參考,以及顯示參考歷程記錄的標記追蹤器,請使用 !wdfkd.wdfdevice 搭配詳細資訊旗標:

kd> !wdfkd.wdfdevice 0x6d939790 ff
Power references: 0 !wdftagtracker 0x9ea030a8

呼叫 !wdfkd.wdftagtracker 會顯示裝置的電源參考歷程記錄:

kd> !wdftagtracker 0x9ea030a8
Reference and Release History:
# (showing most recent first; refcount is approximate in multi-threaded scenarios)

## 3 entries, history depth is 25

(--) 0 ref: Tag '....' at Time 0x1331e ticks
##      path\to\your\driver\code.c @ 374

(++) 1 refs: Tag '....' at Time 0x1331e ticks
##      path\to\your\driver\code.c @ 372

(++) Initial Tag '....' at Time 0x12c9a ticks

指定標記

選擇性地指定標記名稱,以協助識別特定的電源參考。 若要這樣做,請使用 WdfDeviceStopIdleWithTagWdfDeviceResumeIdleWithTag

status = WdfDeviceStopIdleWithTag(device, FALSE, (PVOID)'oyeH');
if (NT_SUCCESS(status)) {
    WdfDeviceResumeIdleWithTag(device, (PVOID)'oyeH');
}

對應的 !wdftagtracker 範例輸出:

(--) 0 ref: Tag 'Heyo' at Time 0x24e40 ticks
##      path\to\your\driver\code.c @ 374

(++) 1 refs: Tag 'Heyo' at Time 0x24e40 ticks
##      path\to\your\driver\code.c @ 372

(++) Initial Tag '....' at Time 0x12c9a ticks