Vyhledání neúspěšného procesu

Před nalezením selhalého procesu se ujistěte, že jste v kontextu přijímajícího procesoru. Chcete-li určit přijímající procesor, použijte rozšíření !pcr na každém procesoru a vyhledejte procesor, pro který byla načtena obslužná rutina výjimky. Obslužná rutina výjimky přijímajícího procesoru má jinou adresu než 0xFFFFFFFF.

Například vzhledem k tomu, že adresa NtTib.ExceptionList v tomto procesoru je 0xFFFFFFFF, nejedná se o procesor s neúspěšným procesem:

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: 

Výsledky procesoru 1 se ale liší. V tomto případě je hodnota NtTib.ExceptionListf0823cc0, nikoli 0xFFFFFFFF, což znamená, že se jedná o procesor, na kterém došlo k výjimce.

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: 

Pokud jste ve správném kontextu procesoru, !process rozšíření zobrazí aktuálně spuštěný proces.

Nejzajímavějšími částmi výpisu procesu jsou:

  • Časy (vysoká hodnota označuje, že proces může být příčinou).

  • Počet popisovačů (číslo uvedené v závorce za ObjectTable v první položce).

  • Stav vlákna (mnoho procesů má více vláken). Pokud je aktuální proces nečinný, je pravděpodobné, že stroj je skutečně nečinný nebo se zablokoval v důsledku nějakého neobvyklého problému.

Použití rozšíření !process 0 7 je sice nejlepší způsob, jak najít problém na zaseknutém systému, ale někdy poskytuje příliš mnoho informací na filtrování. Místo toho použijte !process 0 0 a poté !process na popisovač procesu pro CSRSS a všechny ostatní podezřelé procesy.

Při použití !process 0 7může být mnoho vláken označeno jako "zásobník jádra nebyl načten", protože tyto zásobníky jsou vystránkované. Pokud jsou tyto stránky stále v mezipaměti, která je v přechodu, můžete získat další podrobnosti pomocí .cache dekódovat před !process 0 7:

kd> .cache decodeptes 
kd> !process 0 7 

Pokud můžete identifikovat proces, který selhává, použijte !process<>7 k zobrazení zásobníků jádra pro každé vlákno v tomto procesu. Tento výstup může identifikovat problém v režimu jádra a odhalit, co podezřelý proces volá.

Kromě !processvám můžou pomoct následující rozšíření určit příčinu nereagujícího počítače:

Prodloužení Účinek

!připraveno

Identifikuje vlákna, která jsou připravená ke spuštění, v pořadí podle priority.

!kdext*.locks

Identifikuje všechny zámky uložených prostředků v případě, že dojde k zablokování s vypršením časového limitu maloobchodního prodeje.

!vm

Zkontroluje využití virtuální paměti.

!poolused

Určuje, zda je jeden typ alokace fondu nepřiměřeně velký (požadováno označování fondu).

!využitípaměti

Zkontroluje stav fyzické paměti.

!halda

Kontroluje platnost haldy.

!irpfind

Prohledává nestránkovaný fond pro aktivní IRP.

Pokud zadané informace nenaznačují neobvyklou situaci, zkuste nastavit místo přerušení na ntoskrnl!KiSwapThread, aby bylo možné určit, jestli je procesor zablokovaný v jednom procesu nebo jestli stále plánuje jiné procesy. Pokud není zablokovaný, nastavte zarážky v běžných funkcích, jako je například NtReadFile, abyste určili, zda je počítač zablokovaný v konkrétní cestě kódu.