Compartir a través de


Búsqueda del proceso con errores

Antes de encontrar el proceso con errores, asegúrese de que está en el contexto del procesador de aceptación. Para determinar el procesador de aceptación, use la extensión !pcr en cada procesador y busque el procesador para el que se ha cargado un controlador de excepciones. El controlador de excepciones del procesador de aceptación tiene una dirección distinta de 0xFFFFFFFF.

Por ejemplo, dado que la dirección de NtTib.ExceptionList en este procesador es 0xFFFFFFFF, este no es el procesador con el proceso con error:

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: 

Sin embargo, los resultados del procesador 1 son bastante diferentes. En este caso, el valor de NtTib.ExceptionList es f0823cc0, no 0xFFFFFFFF, lo que indica que se trata del procesador en el que se produjo la excepción.

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: 

Cuando se encuentra en el contexto de procesador correcto, la extensión !process muestra el proceso que se está ejecutando actualmente.

Las partes más interesantes del volcado de proceso son:

  • Las horas (un valor alto indica que el proceso podría ser el culpable).

  • Recuento de identificadores (este es el número entre paréntesis después de ObjectTable en la primera entrada).

  • El estado del subproceso (muchos procesos tienen varios subprocesos). Si el proceso actual es Inactivo, es probable que la máquina esté realmente inactiva o que se bloquea debido a algún problema inusual.

Aunque el uso de la extensión !process 0 7 es la mejor manera de encontrar el problema en un sistema bloqueado, a veces es demasiado información para filtrar. En su lugar, use un proceso !process 0 0 y, a continuación, un !process en el identificador de proceso para CSRSS y cualquier otro proceso sospechoso.

Cuando se usa un proceso !process 0 7, muchos de los subprocesos pueden marcarse como "pila de kernel no residente" porque esas pilas se paginan. Si esas páginas todavía están en la memoria caché que está en transición, puede obtener más información mediante un descodificador .cache antes de !process 0 7:

kd> .cache decodeptes 
kd> !process 0 7 

Si puede identificar el proceso con errores, use el proceso> !process <7 para mostrar las pilas de kernel para cada subproceso del proceso. Esta salida puede identificar el problema en modo kernel y revelar lo que llama al proceso sospechoso.

Además de !process, las siguientes extensiones pueden ayudar a determinar la causa de un equipo que no responde:

Extensión Efecto

!listo

Identifica los subprocesos que están listos para ejecutarse, en orden de prioridad.

!kdext*.locks

Identifica los bloqueos de recursos mantenidos, en caso de que haya un interbloqueo con tiempos de espera de venta al por menor.

!Vm

Comprueba el uso de la memoria virtual.

!poolused

Determina si un tipo de asignación de grupo es desproporcionadamente grande (se requiere etiquetado de grupos).

!memusage

Comprueba el estado de la memoria física.

!montón

Comprueba la validez del montón.

!irpfind

Busca en grupos no paginados los IRP activos.

Si la información proporcionada no indica una condición inusual, intente establecer un punto de interrupción en ntoskrnl. KiSwapThread para determinar si el procesador está bloqueado en un proceso o si sigue programando otros procesos. Si no está bloqueado, establezca puntos de interrupción en funciones comunes, como NtReadFile, para determinar si el equipo está bloqueado en una ruta de acceso de código específica.