Debuggen von Energieverweisverlusten in WDF

Wenn ein WDF-Treiber (Windows Driver Frameworks) WdfDeviceStopIdle aufruft, erhöht das Framework die Anzahl der Energiereferenzen des Geräts. Jeder erfolgreiche Aufruf von WdfDeviceStopIdle muss durch einen Aufruf von WdfDeviceResumeIdle abgeglichen werden, um die Energieverweisanzahl zu verringern.

Ab Kernel-Mode Driver Framework (KMDF) 1.15 und User-Mode Driver Framework (UMDF) 2.15 können Sie die Energiereferenznutzung mithilfe der Debuggererweiterungen !wdfkd.wdfdevice und !wdfkd.wdftagtracker überwachen. Diese Funktionalität ist aus Leistungsgründen standardmäßig deaktiviert, sodass Sie sie mit der WdfVerifier-Anwendung oder durch manuelles Bearbeiten des Dienstschlüssels des Treibers aktivieren müssen.

WdfVerifier

Öffnen Sie die Einstellungsliste für Ihren Treiber, und klicken Sie mit der rechten Maustaste auf die Einstellung TrackPower . Wählen Sie die für Ihr Szenario geeignete Option aus.

Tipp Vermeiden Sie das Erfassen von Stapelablaufverfolgungen in leistungskritischen Codepfaden.

Screenshot: Festlegen von Leistungsbezügen in WdfVerifier nachverfolgen

Bearbeiten der Registrierung

Sie können auch die Überprüfungsunterstützung und die Energieverweisnachverfolgung aktivieren, indem Sie den Dienstschlüssel Ihres Treibers bearbeiten.

Für einen KMDF-Treiber:

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

Für einen UMDF-Treiber:

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)

Treibercode

Treiber rufen WdfDeviceStopIdle und WdfDeviceResumeIdle auf, um den Betriebsleistungszustand des Geräts wie folgt zu verwalten:

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

Debuggen mit WdfKd

Verwenden Sie !wdfkd.wdfdevice mit ausführlichen Flags, um die auf dem Gerät verwendeten Energieverweise sowie einen Tag-Tracker anzuzeigen, der den Referenzverlauf anzeigt:

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

Beim Aufrufen von !wdfkd.wdftagtracker wird der Energieverweisverlauf des Geräts angezeigt:

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

Angeben eines Tags

Geben Sie optional einen Tagnamen an, um die Identifizierung bestimmter Energieverweise zu erleichtern. Verwenden Sie dazu WdfDeviceStopIdleWithTag und WdfDeviceResumeIdleWithTag:

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

Entsprechende !wdftagtracker-Beispielausgabe :

(--) 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