Video: Debug del driver con il codice sorgente WDF
Questo argomento contiene un'esercitazione video che illustra come eseguire il debug del driver windows (WDF) con accesso completo al codice sorgente WDF. Il video seguente è la procedura dettagliata seguita nel video, per un riferimento pratico.
Il debug dell'origine WDF consente di eseguire liberamente il codice framework senza dover scaricare il codice sorgente WDF. Il debugger scarica automaticamente la versione corretta di WDF da GitHub.
Ad esempio, se si usa WinDbg per eseguire il debug del driver WDF in un computer Windows 10 e il debugger viene interrotto con il codice framework nello stack di chiamate, è possibile fare doppio clic sul frame WDF nella visualizzazione Stack chiamate e WinDbg scarica automaticamente il file di origine WDF pertinente nella riga corrispondente. È quindi possibile eseguire il codice e impostare i punti di interruzione.
Questa funzionalità è disponibile per i sistemi di destinazione che eseguono versioni pubbliche di Windows 10, Technical Preview build 10041 o versioni successive. Queste build dispongono di file di simboli indicizzati a origine privata per KMDF (Wdf01000.sys) e UMDF (Wudfx02000.dll) disponibili nel server di simboli pubblici Microsoft. Il debug a livello di origine del codice WDF è disponibile solo in WinDbg e non nel debugger di Visual Studio.
Introduzione
Avviare una sessione di debug del kernel WinDbg nel computer di destinazione, eseguire l'interruzione e seguire questa procedura:
Impostare il percorso del simbolo predefinito usando .symfix. Questo imposta il percorso del simbolo per puntare al server dei simboli in https://msdl.microsoft.com/download/symbols.
kd> .symfix
Impostare il percorso di origine predefinito usando .srcfix. Questo imposta il percorso di origine su srv*, che indica al debugger di recuperare i file di origine dai percorsi specificati nei file di simboli dei moduli di destinazione.
kd> .srcfix Source search path is: SRV*
Ricaricare i simboli usando il ricaricamento e verificare che i simboli di Wdf01000.sys (o Wudfx02000.dll per UMDF) siano indicizzati dall'origine. Come illustrato nell'output di !lmi seguente, il Wdf01000.sys PDB viene indicizzato. Se i dati non sono, vedere la sezione Installazione winDbg seguente.
kd> .reload ... kd> !lmi wdf01000.sys Loaded Module Info: [wdf01000.sys] ... Load Report: private symbols & lines, source indexed C:\...\Wdf01000.pdb\...\Wdf01000.pdb
Ora sei tutto impostato! Un modo semplice per eseguire il codice sorgente WDF consiste nell'impostare un punto di interruzione nella routine di invio IRP del framework e quindi passare il resto del codice. Poiché un sistema Windows ha molti driver KMDF in arrivo, WDF viene sempre caricato ed in esecuzione, quindi questo punto di interruzione verrà colpito immediatamente (senza dover caricare il proprio driver).
kd> bp Wdf01000!FxDevice::DispatchWithLock kd> g Breakpoint 0 hit Wdf01000!FxDevice::DispatchWithLock: 87131670 8bff mov edi,edi
Se questa operazione non funziona, vedere i passaggi di installazione di WinDbg seguenti.
Installazione di WinDbg
Se l'esempio precedente non funzionava come previsto, potrebbe essere necessario eseguire una o più delle istruzioni riportate di seguito.
Abilitare il debug in modalità origine
Assicurarsi che il debug in modalità di origine sia abilitato. Aprire il menu Debug e verificare che la modalità di origine sia selezionata.
Cancella cache simboli non aggiornati
Se in precedenza sono stati sottoposti a debug i driver WDF per la stessa destinazione di Windows, è possibile usare i simboli WDF memorizzati nella cache locale che non sono stati indicizzati dall'origine. È possibile controllare questo comando con il comando !lmi:
kd> !lmi Wdf01000.sys
Loaded Module Info: [wdf01000.sys]
...
Load Report: private symbols & lines, not source indexed
C:\...\Wdf01000.pdb\...\Wdf01000.pdb
Secondo il report di carico precedente, Wdf01000.pdb non è indicizzato. Ciò significa che la cache dei simboli WinDbg locale non è aggiornata. Per risolvere questo problema, scaricare il PDB da WinDbg, cancellare la cache locale (il percorso può essere diverso in base all'output !lmi precedente) e ricaricare il PDB:
kd> .reload /u Wdf01000.sys
CMD> del
C:\...\Wdf01000.pdb\...\Wdf01000.pdb
kd> .reload Wdf01000.sys
Eseguire ora !lmi per controllare di nuovo: il PDB dovrebbe essere visualizzato come indicizzato dall'origine e verrà visualizzata una finestra del codice sorgente.
kd> !lmi Wdf01000.sys
Loaded Module Info: [wdf01000.sys]
...
Load Report: private symbols & lines, source indexed
C:\...\Wdf01000.pdb\...\Wdf01000.pdb
È possibile usare il debug a livello di origine WDF non solo per il debug live e l'analisi dei dump di arresto anomalo, ma anche per altre informazioni sui framework interni impostando punti di interruzione sulle funzioni di base, ad esempio il dispatcher IRP e esplorando i percorsi di codice successivi.