共用方式為


在 WDF 中除錯電源參考洩漏

當 Windows Driver Frameworks (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\<驅動程式服務名稱>\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