Delen via


Het mislukte proces vinden

Voordat u het mislukte proces vindt, moet u ervoor zorgen dat u zich in de context van de accepterende processor bevindt. Als u de accepterende processor wilt bepalen, gebruikt u de extensie !pcr op elke processor en zoekt u naar de processor waarvoor een uitzonderingshandler is geladen. De uitzonderingshandler van de accepterende processor heeft een ander adres dan 0xFFFFFFFF.

Omdat het adres van NtTib.ExceptionList op deze processor bijvoorbeeld is 0xFFFFFFFF, is dit niet de processor met het mislukte proces:

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: 

De resultaten voor Processor 1 zijn echter heel anders. In dit geval is de waarde van NtTib.ExceptionListf0823cc0, niet 0xFFFFFFFF, waarmee wordt aangegeven dat dit de processor is waarop de uitzondering is opgetreden.

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: 

Wanneer u zich in de juiste processorcontext bevindt, wordt in de !-procesextensie het actieve proces weergegeven.

De meest interessante onderdelen van de procesdump zijn:

  • De tijden (een hoge waarde geeft aan dat het proces de schuldige kan zijn).

  • Het aantal handles (dit is het getal tussen haakjes na ObjectTable in de eerste vermelding).

  • De threadstatus (veel processen hebben meerdere threads). Als het huidige proces Idle is, is het waarschijnlijk dat de machine echt inactief is of dat hij vastgelopen is vanwege een ongebruikelijk probleem.

Hoewel het gebruik van de !process 0 7-extensie de beste manier is om het probleem op een vastgelopen systeem te vinden, is het soms te veel informatie om te filteren. Gebruik in plaats daarvan een !-proces 0 0 en vervolgens een !-proces op de procesgreep voor CSRSS en andere verdachte processen.

Wanneer u een !process 0 7 gebruikt, kunnen veel van de threads worden gemarkeerd als 'kernel stack niet aanwezig' omdat deze stacks zijn uitgepagineerd. Als deze pagina's zich nog in de cache bevinden en in transitie zijn, kunt u meer informatie krijgen met behulp van .cache decodeptes vóór !process 0 7:

kd> .cache decodeptes 
kd> !process 0 7 

Als u het niet-werkende proces kunt identificeren, gebruik !proces<>7 om de kernelstacks voor elke thread in het proces weer te geven. Deze uitvoer kan het probleem in de kernelmodus identificeren en laten zien wat het verdachte proces aanroept.

Naast !proces kunnen de volgende extensies helpen om de oorzaak van een niet-reagerende computer te bepalen:

Uitbreiding Gevolg

!klaar

Identificeert de threads die klaar zijn om te worden uitgevoerd, in volgorde van prioriteit.

!kdext*.locks

Identificeert eventuele vastgehouden resourcevergrendelingen, voor het geval er een impasse is met time-outs voor de detailhandel.

!Vm

Controleert het gebruik van het virtuele geheugen.

!poolused

Bepaalt of één type pooltoewijzing onevenredig groot is (pooltags vereist).

!memusage

Controleert de status van het fysieke geheugen.

!heap

Controleert de geldigheid van de heap.

!irpfind

Zoekt in een niet-gepaginade pool naar actieve IRP's.

Als de verstrekte informatie geen ongebruikelijke voorwaarde aangeeft, kunt u proberen een onderbrekingspunt in te stellen op ntoskrnl! KiSwapThread om te bepalen of de processor is vastgelopen in een proces of als het nog steeds andere processen plant. Als het niet vastloopt, stelt u onderbrekingspunten in algemene functies, zoals NtReadFile, in om te bepalen of de computer vastzit in een specifiek codepad.