Recherche du processus ayant échoué
Avant de trouver le processus ayant échoué, assurez-vous que vous êtes dans le contexte du processeur accepté. Pour déterminer le processeur acceptant, utilisez l’extension !pcr sur chaque processeur et recherchez le processeur pour lequel un gestionnaire d’exceptions a été chargé. Le gestionnaire d’exceptions du processeur accepté a une adresse autre que 0xFFFFFFFF.
Par exemple, étant donné que l’adresse de NtTib.ExceptionList sur ce processeur est 0xFFFFFFFF, ce n’est pas le processeur avec le processus ayant échoué :
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:
Toutefois, les résultats du processeur 1 sont très différents. Dans ce cas, la valeur de NtTib.ExceptionList est f0823cc0, et non 0xFFFFFFFF, indiquant qu’il s’agit du processeur sur lequel l’exception s’est produite.
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:
Lorsque vous êtes dans le contexte de processeur correct, l’extension !process affiche le processus en cours d’exécution.
Les parties les plus intéressantes du vidage de processus sont les suivantes :
Les heures (une valeur élevée indique que le processus peut être le coupable).
Nombre de handles (il s’agit du nombre entre parenthèses après ObjectTable dans la première entrée).
État du thread (de nombreux processus ont plusieurs threads). Si le processus actuel est inactif, il est probable que l’ordinateur soit réellement inactif, soit qu’il soit suspendu en raison d’un problème inhabituel.
Bien que l’utilisation de l’extension !process 0 7 soit la meilleure façon de trouver le problème sur un système suspendu, il est parfois trop d’informations à filtrer. Au lieu de cela, utilisez un !process 0 0 , puis un processus !sur le handle de processus pour CSRSS et tous les autres processus suspects.
Lors de l’utilisation d’un !process 0 7, un grand nombre de threads peuvent être marqués « pile de noyau non résidente », car ces piles sont paginées. Si ces pages se trouvent toujours dans le cache en cours de transition, vous pouvez obtenir plus d’informations à l’aide d’un décodage .cache avant !process 0 7 :
kd> .cache decodeptes
kd> !process 0 7
Si vous pouvez identifier le processus défaillant, utilisez le processus !process>< 7 pour afficher les piles de noyau pour chaque thread du processus. Cette sortie peut identifier le problème en mode noyau et révéler ce que le processus suspect appelle.
En plus du processus !, les extensions suivantes peuvent aider à déterminer la cause d’un ordinateur qui ne répond pas :
Extension | Effet |
---|---|
Identifie les threads prêts à s’exécuter, dans l’ordre de priorité. |
|
Identifie les verrous de ressources conservés, en cas d’interblocage avec des délais d’attente de vente au détail. |
|
Vérifie l’utilisation de la mémoire virtuelle. |
|
Détermine si un type d’allocation de pool est disproportionnée (balisage de pool requis). |
|
Vérifie l’état de la mémoire physique. |
|
Vérifie la validité du tas. |
|
Recherche le pool non paginé pour les adresses IP virtuelles actives. |
Si les informations fournies n’indiquent pas de condition inhabituelle, essayez de définir un point d’arrêt sur ntoskrnl ! KiSwapThread pour déterminer si le processeur est bloqué dans un processus ou s’il planifie toujours d’autres processus. S’il n’est pas bloqué, définissez des points d’arrêt dans des fonctions courantes, telles que NtReadFile, pour déterminer si l’ordinateur est bloqué dans un chemin de code spécifique.