!process
La extensión !process muestra información sobre el proceso especificado o sobre todos los procesos, incluido el bloque EPROCESS.
Esta extensión solo se puede usar durante la depuración en modo kernel.
Sintaxis
!process [/s Session] [/m Module] [Process [Flags]]
!process [/s Session] [/m Module] 0 Flags ImageName
Parámetros
/s **** Sesión
Especifica la sesión a la que pertenece el proceso deseado.
/m **** Módulo
Especifica el módulo al que pertenece el proceso deseado.
Proceso
Especifica la dirección hexadecimal o el identificador de proceso del proceso en el equipo de destino.
El valor de Process determina si la extensión !process muestra una dirección de proceso o un identificador de proceso . Si Process se omite en cualquier versión de Windows, el depurador solo muestra datos sobre el proceso del sistema actual. Si Process es 0 e ImageName se omite, el depurador muestra información sobre todos los procesos activos. Si se especifica -1 para Process, se muestra información sobre el proceso actual.
Flags
Especifica el nivel de detalle que se muestra. Flags puede ser cualquier combinación de los siguientes bits. Si Flags es igual a 0, solo se muestra una cantidad mínima de información. El valor predeterminado varía según la versión de Windows y el valor de Process. El valor predeterminado es 0x3 si se omite Process o si Process es 0 o -1; de lo contrario, el valor predeterminado es 0xF.
Bit 0 (0x1)
Muestra estadísticas de tiempo y prioridad.
Bit 1 (0x2)
Muestra una lista de subprocesos y eventos asociados al proceso y sus estados de espera.
Bit 2 (0x4)
Muestra una lista de subprocesos asociados al proceso. Si se incluye sin Bit 1 (0x2), cada subproceso se muestra en una sola línea. Si se incluye con Bit 1, cada subproceso se muestra con un seguimiento de la pila.
Bit 3 (0x8)
Muestra la dirección de retorno y el puntero de pila para cada función Se suprime la presentación de argumentos de función.
Bit 4 (0x10)
Establece el mismo contexto del proceso que el del proceso especificado durante la duración de este comando. Esto da como resultado una visualización más precisa de las pilas de subprocesos. Dado que esta marca es equivalente a usar .process /p /r para el proceso especificado, se descartará cualquier lista de módulos en modo de usuario existente. Si el valor de Process es cero, el depurador muestra todos los procesos y el contexto del proceso se cambia para cada uno. Si solo muestra un único proceso y su estado en modo de usuario ya se ha actualizado (por ejemplo, con .process /p /r), no es necesario usar esta marca. Esta marca solo es efectiva cuando se usa con Bit 0 (0x1).
ImageName
Especifica el nombre del proceso que se va a mostrar. El depurador muestra todos los procesos cuyos nombres de imagen ejecutables coinciden con ImageName. El nombre de la imagen debe coincidir con el del bloque EPROCESS. En general, se trata del nombre del ejecutable que se invocó para iniciar el proceso, incluida la extensión del archivo (normalmente .exe), y truncado después del decimoquinto carácter. No hay posibilidad de especificar un nombre de imagen que contenga un espacio. Cuando se especifica ImageName, el valor de Process debe ser cero.
Archivo DLL
Kdexts.dll
Información adicional
Para obtener información sobre procesos en modo kernel, consulte Cambio de contextos. Para obtener más información sobre el análisis de procesos y subprocesos, consulte Microsoft Windows Internals por Mark Russinovich y David Solomon.
Comentarios
A continuación se muestra un ejemplo de una visualización de !process 0 0:
kd> !process 0 0
**** NT ACTIVE PROCESS DUMP ****
PROCESS 80a02a60 Cid: 0002 Peb: 00000000 ParentCid: 0000
DirBase: 00006e05 ObjectTable: 80a03788 TableSize: 150.
Image: System
PROCESS 80986f40 Cid: 0012 Peb: 7ffde000 ParentCid: 0002
DirBase: 000bd605 ObjectTable: 8098fce8 TableSize: 38.
Image: smss.exe
PROCESS 80958020 Cid: 001a Peb: 7ffde000 ParentCid: 0012
DirBase: 0008b205 ObjectTable: 809782a8 TableSize: 150.
Image: csrss.exe
PROCESS 80955040 Cid: 0020 Peb: 7ffde000 ParentCid: 0012
DirBase: 00112005 ObjectTable: 80955ce8 TableSize: 54.
Image: winlogon.exe
PROCESS 8094fce0 Cid: 0026 Peb: 7ffde000 ParentCid: 0020
DirBase: 00055005 ObjectTable: 80950cc8 TableSize: 222.
Image: services.exe
PROCESS 8094c020 Cid: 0029 Peb: 7ffde000 ParentCid: 0020
DirBase: 000c4605 ObjectTable: 80990fe8 TableSize: 110.
Image: lsass.exe
PROCESS 809258e0 Cid: 0044 Peb: 7ffde000 ParentCid: 0026
DirBase: 001e5405 ObjectTable: 80925c68 TableSize: 70.
Image: SPOOLSS.EXE
En la tabla siguiente se describen algunos de los elementos de la salida !process 0 0.
Elemento | Significado |
---|---|
Dirección del proceso |
El número hexadecimal de ocho caracteres después de la palabra PROCESS es la dirección del bloque EPROCESS. En la entrada final del ejemplo anterior, la dirección del proceso se 0x809258E0. |
Identificador del proceso (PID) |
Número hexadecimal después de la palabra Cid. En la entrada final del ejemplo anterior, el PID es 0x44 o decimal 68. |
Bloque de Entorno de Proceso (PEB) |
El número hexadecimal después de la palabra Peb es la dirección del bloque de entorno de proceso. En la entrada final del ejemplo anterior, el PEB se encuentra en la dirección 0x7FFDE000. |
PID del proceso primario |
El número hexadecimal después de la palabra ParentCid es el PID del proceso primario. En la entrada final del ejemplo anterior, el PID del proceso primario es 0x26 o decimal 38. |
Imagen |
Nombre del módulo al que pertenece el proceso. En la entrada final del ejemplo anterior, el módulo es spoolss.exe. En la primera entrada, el propietario es el propio sistema operativo. |
Dirección del objeto de proceso |
Número hexadecimal después de la palabra ObjectTable. En la entrada final del ejemplo anterior, la dirección del objeto de proceso es 0x80925c68. |
Para mostrar los detalles completos en un proceso, establezca Flags en 7. El propio proceso se puede especificar estableciendo Process igual que la dirección del proceso, estableciendo Process igual que el identificador de proceso o estableciendo ImageName igual que nombre de la imagen ejecutable. Este es un ejemplo:
kd> !process fb667a00 7
PROCESS fb667a00 Cid: 0002 Peb: 00000000 ParentCid: 0000
DirBase: 00030000 ObjectTable: e1000f88 TableSize: 112.
Image: System
VadRoot fb666388 Clone 0 Private 4. Modified 9850. Locked 0.
FB667BBC MutantState Signalled OwningThread 0
Token e10008f0
ElapsedTime 15:06:36.0338
UserTime 0:00:00.0000
KernelTime 0:00:54.0818
QuotaPoolUsage[PagedPool] 1480
Working Set Sizes (now,min,max) (3, 50, 345)
PeakWorkingSetSize 118
VirtualSize 1 Mb
PeakVirtualSize 1 Mb
PageFaultCount 992
MemoryPriority BACKGROUND
BasePriority 8
CommitCharge 8
THREAD fb667780 Cid 2.1 Teb: 00000000 Win32Thread: 80144900 WAIT: (WrFreePage) KernelMode Non-Alertable
80144fc0 SynchronizationEvent
Not impersonating
Owning Process fb667a00
WaitTime (seconds) 32278
Context Switch Count 787
UserTime 0:00:00.0000
KernelTime 0:00:21.0821
Start Address Phase1Initialization (0x801aab44)
Initial Sp fb26f000 Current Sp fb26ed00
Priority 0 BasePriority 0 PriorityDecrement 0 DecrementCount 0
ChildEBP RetAddr Args to Child
fb26ed18 80118efc c0502000 804044b0 00000000 KiSwapThread+0xb5
fb26ed3c 801289d9 80144fc0 00000008 00000000 KeWaitForSingleObject+0x1c2
Tenga en cuenta que la dirección del objeto de proceso se puede usar como entrada para otras extensiones, como !handle, para obtener más información.
En la tabla siguiente se describen algunos de los elementos del ejemplo anterior.
Elemento | Significado |
---|---|
WAIT | El comentario paréntesis después de este título muestra el motivo de la espera. El comando dt nt!_KWAIT_REASON mostrará una lista de todas las razones de espera. |
ElapsedTime |
Muestra la cantidad de tiempo transcurrido desde que se creó el proceso. Esto se muestra en unidades de Hours:Minutes:Seconds.Milliseconds. |
UserTime |
Muestra la cantidad de tiempo que el proceso se ha estado ejecutando en modo de usuario. Si el valor de UserTime es excepcionalmente alto, podría identificar un proceso que agote los recursos del sistema. Las unidades son las mismas que las de ElapsedTime. |
KernelTime |
Muestra la cantidad de tiempo que el proceso se ha estado ejecutando en modo de kernel Si el valor de KernelTime es excepcionalmente alto, podría identificar un proceso que agote los recursos del sistema. Las unidades son las mismas que las de ElapsedTime. |
Tamaño de espacio de trabajo |
Enumera el tamaño actual, mínimo y máximo del espacio de trabajo para el proceso, en páginas. Un espacio de trabajo excepcionalmente grande puede ser un signo de un proceso que está filtrando memoria o agotando los recursos del sistema. |
Entradas de QuotaPoolUsage |
Enumera el grupo paginado y no paginado usado por el proceso. En un sistema con una pérdida de memoria, buscar un uso excesivo del grupo no paginado en todos los procesos puede indicarle qué proceso tiene la pérdida de memoria. |
Clonar |
Indica si el proceso fue creado por los subsistemas POSIX o Interix. |
Privada |
Indica el número de páginas privadas (no compartibles) que está usando actualmente el proceso. Esto incluye la memoria paginada y no paginada. |
Además de la información de la lista de procesos, la información del subproceso contiene una lista de los recursos en los que el subproceso tiene bloqueos. Esta información aparece en la tercera línea de salida después del título del subproceso. En este ejemplo, el subproceso tiene un bloqueo en un recurso, un SynchronizationEvent con una dirección de 80144fc0. Al comparar esta dirección con la lista de bloqueos mostrados por la extensión !kdext*.locks , puede determinar qué subprocesos tienen bloqueos exclusivos en los recursos.
La extensión !stacks proporciona un breve resumen del estado de cada subproceso. Esto se puede usar en lugar de la extensión !process para obtener una visión general rápida del sistema, especialmente cuando se depuran problemas multiproceso, como conflictos de recursos o interbloqueos.