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 |
---|---|
Identifica los subprocesos que están listos para ejecutarse, en orden de prioridad. |
|
Identifica los bloqueos de recursos mantenidos, en caso de que haya un interbloqueo con tiempos de espera de venta al por menor. |
|
Comprueba el uso de la memoria virtual. |
|
Determina si un tipo de asignación de grupo es desproporcionadamente grande (se requiere etiquetado de grupos). |
|
Comprueba el estado de la memoria física. |
|
Comprueba la validez del montón. |
|
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.