Condividi tramite


Come abilitare il debug di un driver UMDF

È possibile usare le configurazioni seguenti per eseguire il debug di un driver User-Mode Driver Framework (UMDF) durante lo sviluppo. Tutte le configurazioni includono due computer, un host e una destinazione.

  • Copiare manualmente il driver nella destinazione desiderata. Eseguire il debugging in modalità utente sul target. In questo scenario, ci si connette manualmente a un'istanza del processo host del driver in esecuzione sull'obiettivo.
  • Copiare manualmente il driver nella destinazione e quindi eseguire il debug in modalità kernel dall'host.

È consigliabile eseguire tutti i test e lo sviluppo di driver UMDF con un debugger del kernel collegato.

Procedure consigliate

È consigliabile eseguire tutti i test del driver UMDF con un debugger del kernel collegato.

Sono consigliate le impostazioni seguenti. È possibile impostare queste impostazioni manualmente oppure usare lo strumento WDF Verifier Control Application (WDFVerifier.exe) in WDK per visualizzare o modificare queste impostazioni.

  • Abilitare Application Verifier in WUDFHost.exe:

    AppVerif –enable Heaps Exceptions Handles Locks Memory TLS Leak –for WudfHost.exe
    

    Se si verificano eccezioni, Application Verifier invia messaggi di diagnostica al debugger e si interrompe.

  • Se si usa una sessione di debug in modalità kernel, impostare HostFailKdDebugBreak in modo che il riflettore si interrompa nel debugger in modalità kernel prima di terminare il processo host del driver. Questa impostazione è abilitata per impostazione predefinita a partire da Windows 8.

  • Disabilitare il pooling impostando UmdfHostProcessSharing su ProcessSharingDisabled. Per info, consultare Specificare le direttive WDF nei file INF.

  • Per impostazione predefinita, quando un dispositivo UMDF ha esito negativo, il framework tenta di riavviarlo fino a cinque volte. È possibile disattivare il riavvio automatico impostando DebugModeFlags su 0x01. Per altre informazioni, vedere valori del Registro di sistema per il debug dei driver WDF.

  • Riavviare il computer.

  • Per eseguire il debug dei problemi del driver UMDF, consultare Determinare perché il reflector ha terminato il processo host e Debugging degli arresti anomali del driver UMDF

Uso di WinDbg per collegarsi manualmente (debug in modalità utente)

Nel computer di destinazione è possibile collegare manualmente WinDbg all'istanza di WUDFHost che ospita il driver. Quando colleghi, entri nel debugger ed è possibile impostare punti di interruzione nel tuo driver.

Poiché l'inizializzazione del driver si verifica poco dopo il caricamento di WUDFHost, non è possibile collegarsi manualmente nel tempo per eseguire il debug del codice di inizializzazione. Impostare invece un valore del Registro di sistema per fare in modo che il processo host attenda alcuni secondi durante l'inizializzazione dell'host o il tempo di caricamento del driver. Questo ritardo consente di collegare WinDbg all'istanza corretta del processo WUDFHost.

Seguire questa procedura:

  1. Nel registro di sistema del computer di destinazione, impostare HostProcessDbgBreakOnStart o HostProcessDbgBreakOnDriverLoad su un determinato numero di secondi e poi riavviare.
  2. Nel computer di destinazione aprire WinDbg come amministratore.
  3. Nel menu File , scegliere Collega a Processo . Selezionare By Executablee individuare tutti i processi denominati WUDFHost.exe (potrebbero non essere presenti). Se sono presenti processi denominati WUDFHost.exe, annotare gli identificatori di processo per riferimento futuro.
  4. In Gestione dispositivi abilitare il driver.
  5. Ripetere il passaggio 2 e individuare una nuova istanza di WUDFHost.exe. Se non viene visualizzata una nuova istanza di WUDFHost.exe, selezionare Annulla e scegliere di nuovo Connetti a processo . Quando si trova la nuova istanza di WUDFHost.exe, selezionarla e selezionare OK.

Se il pool di dispositivi è in uso e si imposta il valore di registro HostProcessDbgBreakOnDriverLoad, è possibile che si verifichino interruzioni del debugger a causa del caricamento di altri driver. È possibile disattivare il pool di dispositivi usando la modalità di debug di UMDF.

Per usare la modalità di debug, usare l'opzione F5 in Visual Studio oppure impostare i valori DebugModeFlags e DebugModeBinaries nel Registro di sistema.

Per informazioni dettagliate sui valori del Registro di sistema UMDF, vedere valori del Registro di sistema per il debug dei driver WDF (KMDF e UMDF).

Uso di WinDbg per eseguire il debug remoto da un computer host (debug in modalità kernel)

Da un host remoto stabilire una sessione di debug in modalità kernel. Impostare quindi il processo corrente sull'istanza di Wudfhost che ospita il driver. Se si esegue il debug da un debugger del kernel remoto, impostare HostProcessDbgBreakOnDriverStart o HostProcessDbgBreakOnDriverLoad su 0x80000000 per non specificare alcun timeout e per entrare nel debugger del kernel.

Seguire questa procedura:

  1. Disabilitare il pooling. Attiva DebugModeFlags e elenca il tuo driver in DebugModeBinaries.

  2. Se il driver usa UMDF 1.11 o versione successiva, hostFailKdDebugBreak è abilitato per impostazione predefinita. Ignorare questo passaggio.

    Se il driver usa UMDF 1.9 o versioni precedenti, impostare HostFailKdDebugBreak su 1.

  3. Nel caso di problemi relativi ai timeout, disattivare HostProcessDbgBreakOnDriverStart e HostProcessDbgBreakOnDriverLoad. Quando HostProcessDbgBreakOnDriverStart o HostProcessDbgBreakOnDriverLoad è diverso da zero, il framework disabilita i timeout in modo che il riflettore non termini l'host mentre un debugger in modalità utente è collegato al processo host. Se è necessario eseguire il debug del codice di inizializzazione del driver, invece di usare questi due valori, provare a eseguire il comando seguente in WinDbg prima del caricamento del driver: sxe ld:MyDriver.dll (interruzione al caricamento del modulo)

  4. Riavviare se sono state apportate modifiche al Registro di sistema.

  5. A seconda delle selezioni effettuate nei passaggi precedenti, il debugger del kernel remoto si interrompe quando il driver viene caricato o scaricato sulla destinazione.