Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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 |
|---|---|
Identificeert de threads die klaar zijn om te worden uitgevoerd, in volgorde van prioriteit. |
|
Identificeert eventuele vastgehouden resourcevergrendelingen, voor het geval er een impasse is met time-outs voor de detailhandel. |
|
Controleert het gebruik van het virtuele geheugen. |
|
Bepaalt of één type pooltoewijzing onevenredig groot is (pooltags vereist). |
|
Controleert de status van het fysieke geheugen. |
|
Controleert de geldigheid van de heap. |
|
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.