Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
È possibile eseguire il debug del kernel locale avviando il debugger del kernel (KD) o WinDbg con l'opzione della riga di comando -kl:
kd [-y SymbolPath] -kl
o
windbg [-y SymbolPath] -kl
In Windows Vista e versioni successive, il debug del kernel locale richiede l'avvio del computer con l'opzione /debug. Aprire una finestra del prompt dei comandi come amministratore e immettere bcdedit /debug on. Riavviare il computer.
Importante
Prima di usare BCDEdit per modificare le informazioni di avvio, potrebbe essere necessario sospendere temporaneamente le funzionalità di sicurezza di Windows, ad esempio BitLocker e Avvio protetto nel PC di test. Riabilitare queste funzionalità di sicurezza al termine del test e gestire in modo appropriato il PC di test, quando le funzionalità di sicurezza sono disabilitate.
In Windows Vista e versioni successive, il debug del kernel locale richiede l'esecuzione del debugger come amministratore.
Il debugging locale dal vivo è estremamente utile per il debug di problemi difficili da riprodurre quando il debugger è collegato; tuttavia, è improbabile che tutto ciò che richiede una conoscenza delle informazioni sensibili al tempo, inclusi i dati di pacchetti, IRP e SRB, funzioni a meno che il problema non sia un blocco o uno stallo.
Quando si esegue il debug locale, considerare le variabili seguenti:
Stati generali. Ad esempio, il flusso è funzionante? Il flusso è sospeso?
Conteggi dei pacchetti. Ad esempio, ci sono IRP in coda al flusso?
Modifiche apportate ai conteggi dei pacchetti. Il flusso è in movimento?
Modifiche negli elenchi di pacchetti.
I thread kernel bloccati.
Si consideri l'ultima di queste.
Analisi di un thread bloccato in LKD
Per prima cosa, usa l'estensione !process 0 0 per identificare il processo contenente il thread bloccato. Quindi, esegui di nuovo !process per ulteriori informazioni su tale thread:
lkd> !process 816a550 7
THREAD 81705da8 Cid 0b5c.0b60 Teb: 7ffde000 Win32Thread: e1b2d890 WAIT: (Suspended)
IRP List:
816c9ad8: (0006,0190) Flags: 00000030 Mdl: 00000000
Start Address kernel32!BaseProcessStartThunk (0x77e5c650)
Win32 Start Address 0x0101c9be
Stack Init f50bf000 Current f50bea74 Base f50bf000 Limit f50b9000 Call 0
Priority 10 BasePriority 8 PriorityDecrement 0
I thread non sono visualizzati, ma gli indirizzi dello stack sì. Usando il comando dds (o ddq) sull'indirizzo corrente nello stack si ottiene un punto di partenza per ulteriori approfondimenti, perché specifica quale processo sta chiamando.
lkd> dds f50bea74
f50bea74 f50bebc4
f50bea78 00000000
f50bea7c 80805795 nt!KiSwapContext+0x25
f50beab4 8080ece0 nt!KeWaitForSingleObject
f50beabc f942afda ks!CKsQueue::CancelAllIrps+0x14
f50bead8 f94406c4 ks!CKsQueue::SetDeviceState+0x170
f50beb00 f943f6f1 ks!CKsPipeSection::DistributeDeviceStateChange+0x1d
f50beb24 f943fb1e ks!CKsPipeSection::SetDeviceState+0xb2