Partager via


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

!prêt

Identifie les threads prêts à s’exécuter, dans l’ordre de priorité.

!kdext*.locks

Identifie les verrous de ressources conservés, en cas d’interblocage avec des délais d’attente de vente au détail.

!Vm

Vérifie l’utilisation de la mémoire virtuelle.

!pool utilisé

Détermine si un type d’allocation de pool est disproportionnée (balisage de pool requis).

!memusage

Vérifie l’état de la mémoire physique.

!tas

Vérifie la validité du tas.

!irpfind

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.