Condividi tramite


Debug delle perdite di riferimento per l'alimentazione in WDF

Quando un driver WDF (Windows Driver Frameworks) chiama WdfDeviceStopIdle, il framework incrementa il conteggio dei riferimenti di potenza del dispositivo. Ogni chiamata riuscita a WdfDeviceStopIdle deve essere abbinata da una chiamata a WdfDeviceResumeIdle per decrementare il conteggio dei riferimenti di potenza.

A partire da Kernel-Mode Driver Framework (KMDF) 1.15 e User-Mode Driver Framework (UMDF) 2.15, è possibile monitorare l'utilizzo del riferimento energetico usando le estensioni !wdfkd.wdfdevice e !wdfkd.wdftagtracker . Questa funzionalità è disabilitata per impostazione predefinita per motivi di prestazioni, pertanto è necessario attivarla con l'applicazione WdfVerifier o modificando manualmente la chiave del servizio del driver.

WdfVerifier

Aprire l'elenco delle impostazioni per il driver e fare clic con il pulsante destro del mouse sull'impostazione TrackPower . Scegliere l'opzione appropriata per lo scenario.

Mancia Evitare di acquisire le tracce dello stack nei percorsi di codice critici per le prestazioni.

Screenshot dell'impostazione dei riferimenti di risparmio energia in WdfVerifier.

Modifica del Registro di sistema

È anche possibile attivare il supporto di Verifier e il rilevamento del riferimento energetico modificando la chiave di servizio del driver.

Per un driver KMDF:

HKLM\SYSTEM\ControlSet001\Services\<Nome> servizio driver\Parameters\Wdf

Per un driver 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)

Codice driver

I driver chiamano WdfDeviceStopIdle e WdfDeviceResumeIdle per gestire lo stato di alimentazione del dispositivo come segue:

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

Debug con WdfKd

Per visualizzare i riferimenti di alimentazione acquisiti nel dispositivo, nonché un tracker di tag che mostra la cronologia dei riferimenti, usare !wdfkd.wdfdevice con flag verbose:

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

La chiamata a !wdfkd.wdftagtracker mostra la cronologia di riferimento per il risparmio energia del dispositivo:

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

Specifica di un tag

Facoltativamente, specificare un nome di tag per facilitare l'identificazione di riferimenti di alimentazione specifici. A tale scopo, usare WdfDeviceStopIdleWithTag e WdfDeviceResumeIdleWithTag:

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

Output di esempio !wdftagtracker corrispondente:

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