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

!pronto

Identifica i thread pronti per l'esecuzione, in ordine di priorità.

!**xt*.locks

Identifica eventuali blocchi delle risorse mantenuti, nel caso in cui si verifichi un deadlock con timeout delle vendite al dettaglio.

!Vm

Controlla l'utilizzo della memoria virtuale.

!poolused

Determina se un tipo di allocazione del pool è eccessivamente grande (è necessario contrassegnare il pool).

!memusage

Controlla lo stato della memoria fisica.

!mucchio

Verifica la validità dell'heap.

!irpfind

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.