Ricerca del processo non riuscito
Prima di trovare il processo non riuscito, assicurarsi di trovarsi nel contesto del processore di accettazione. Per determinare il processore di accettazione, usare l'estensione !pcr in ogni processore e cercare il processore per il quale è stato caricato un gestore eccezioni. Il gestore eccezioni del processore di accettazione ha un indirizzo diverso da 0xFFFFFFFF.
Ad esempio, poiché l'indirizzo di NtTib.ExceptionList in questo processore è 0xFFFFFFFF, questo non è il processore con il processo non riuscito:
0: kd> !pcr
PCR Processor 0 @ffdff000
NtTib.ExceptionList: ffffffff
NtTib.StackBase: 80470650
NtTib.StackLimit: 8046d860
NtTib.SubSystemTib: 00000000
NtTib.Version: 00000000
NtTib.UserPointer: 00000000
NtTib.SelfTib: 00000000
SelfPcr: ffdff000
Prcb: ffdff120
Irql: 00000000
IRR: 00000000
IDR: ffffffff
InterruptMode: 00000000
IDT: 80036400
GDT: 80036000
TSS: 80257000
CurrentThread: 8046c610
NextThread: 00000000
IdleThread: 8046c610
DpcQueue:
Tuttavia, i risultati per Processore 1 sono piuttosto diversi. In questo caso, il valore di NtTib.ExceptionList è f0823cc0, non 0xFFFFFFFF, a indicare che si tratta del processore in cui si è verificata l'eccezione.
0: kd> ~1
1: kd> !pcr
PCR Processor 1 @81497000
NtTib.ExceptionList: f0823cc0
NtTib.StackBase: f0823df0
NtTib.StackLimit: f0821000
NtTib.SubSystemTib: 00000000
NtTib.Version: 00000000
NtTib.UserPointer: 00000000
NtTib.SelfTib: 00000000
SelfPcr: 81497000
Prcb: 81497120
Irql: 00000000
IRR: 00000000
IDR: ffffffff
InterruptMode: 00000000
IDT: 8149b0e8
GDT: 8149b908
TSS: 81498000
CurrentThread: 81496d28
NextThread: 00000000
IdleThread: 81496d28
DpcQueue:
Quando si è nel contesto del processore corretto, l'estensione !process visualizza il processo attualmente in esecuzione.
Le parti più interessanti del dump del processo sono:
I tempi (un valore elevato indica che il processo potrebbe essere il colpevole).
Conteggio handle (numero tra parentesi dopo ObjectTable nella prima voce).
Lo stato del thread (molti processi hanno più thread). Se il processo corrente è inattiva, è probabile che la macchina sia effettivamente inattiva o bloccata a causa di un problema insolito.
Anche se l'uso dell'estensione !process 0 7 è il modo migliore per trovare il problema in un sistema bloccato, a volte è troppo informazioni da filtrare. Usare invece un processo !0 0 e quindi un processo !sull'handle del processo per CSRSS e qualsiasi altro processo sospetto.
Quando si usa un processo !0 7, molti dei thread potrebbero essere contrassegnati come "stack kernel non residente" perché tali stack vengono impaginati. Se tali pagine sono ancora nella cache in fase di transizione, è possibile ottenere altre informazioni usando una decodeptes .cache prima di !process 0 7:
kd> .cache decodeptes
kd> !process 0 7
Se è possibile identificare il processo che ha esito negativo, usare !process>< process 7 per visualizzare gli stack del kernel per ogni thread nel processo. Questo output può identificare il problema in modalità kernel e rivelare cosa sta chiamando il processo sospetto.
Oltre a !process, le estensioni seguenti consentono di determinare la causa di un computer che non risponde:
Estensione | Effetto |
---|---|
Identifica i thread pronti per l'esecuzione, in ordine di priorità. |
|
Identifica eventuali blocchi delle risorse mantenuti, nel caso in cui si verifichi un deadlock con timeout delle vendite al dettaglio. |
|
Controlla l'utilizzo della memoria virtuale. |
|
Determina se un tipo di allocazione del pool è eccessivamente grande (è necessario contrassegnare il pool). |
|
Controlla lo stato della memoria fisica. |
|
Verifica la validità dell'heap. |
|
Cerca in pool non di pagine i runtime di integrazione attivi. |
Se le informazioni fornite non indicano una condizione insolita, provare a impostare un punto di interruzione in ntoskrnl! KiSwapThread per determinare se il processore è bloccato in un processo o se sta ancora pianificando altri processi. Se non è bloccato, impostare i punti di interruzione nelle funzioni comuni, ad esempio NtReadFile, per determinare se il computer è bloccato in un percorso di codice specifico.