!process
A extensão !process mostra informações sobre o processo especificado ou sobre todos os processos, incluindo o bloco EPROCESS.
Esta extensão pode ser usada somente durante a depuração no modo kernel.
Sintaxe
!process [/s Session] [/m Module] [Process [Flags]]
!process [/s Session] [/m Module] 0 Flags ImageName
Parâmetros
/s **** Session
Especifica a sessão que possui o processo desejado.
/m **** Module
Especifica o módulo que possui o processo desejado.
Processo
Especifica o endereço hexadecimal ou o ID do processo no computador de destino.
O valor de Process determina se a extensão !process exibe um endereço de processo ou ID do processo. Se o Process for omitido em qualquer versão do Windows, o depurador mostrará os dados somente sobre o processo atual do sistema. Se Process for 0 e ImageName for omitido, o depurador mostrará informações sobre todos os processos ativos. Se -1 for especificado para Process, serão mostradas as informações sobre o processo atual.
Sinalizadores
Especifica o nível de detalhes a serem exibidos. Flags podem ser qualquer combinação dos bits a seguir. Se Flags for 0, somente uma quantidade mínima de informações será exibida. O padrão varia com a versão do Windows e o valor do Process. O padrão é 0x3 se Process for omitido ou se Process for 0 ou -1. Caso contrário, o padrão será 0xF.
Bit 0 (0x1)
Mostra estatísticas de tempo e prioridade.
Bit 1 (0x2)
Mostra uma lista de threads e eventos associados ao processo e seus estados de espera.
Bit 2 (0x4)
Mostra uma lista de threads associados ao processo. Se isso for incluído sem o Bit 1 (0x2), cada thread aparecerá em uma única linha. Se isso for incluído com o Bit 1, cada thread aparecerá com um rastreamento de pilha.
Bit 3 (0x8)
Mostra o endereço de retorno e o ponteiro de pilha para cada função. A exibição de argumentos de função é suprimida.
Bit 4 (0x10)
Define o contexto do processo igual ao processo especificado na duração deste comando. Isso resulta na exibição mais precisa das pilhas de threads. Como esse sinalizador é equivalente ao uso de .process /p /r para o processo especificado, qualquer lista de módulos de modo de usuário que já existir será descartada. Se Process for zero, o depurador mostrará todos os processos e o contexto do processo será alterado para cada um. Se você estiver exibindo somente um único processo e seu estado de modo de usuário já tiver sido atualizado (por exemplo, com .process /p /r), não será preciso usar esse sinalizador. Esse sinalizador só é efetivo quando é usado com o Bit 0 (0x1).
ImageName
Especifica o nome do processo a ser exibido. O depurador mostra todos os processos cujos nomes de imagem executáveis correspondem a ImageName. O nome da imagem deve corresponder ao nome do bloco EPROCESS. Em geral, esse é o nome executável que foi chamado para iniciar o processo, incluindo a extensão de arquivo (normalmente .exe) e truncado após o décimo quinto caractere. Não é possível especificar um nome de imagem que contenha um espaço. Quando ImageName for especificado, Process deverá ser zero.
DLL
Kdexts.dll
Informações Adicionais
Para obter informações sobre processos no modo kernel, confira Alterando contextos. Para obter mais informações sobre como analisar processos e threads, confira o livro Microsoft Windows Internals de Mark Russinovich e David Solomon.
Comentários
Veja a seguir um exemplo de exibição de um !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
A tabela a seguir descreve alguns dos elementos da saída !process 0 0.
Element | Significado |
---|---|
Endereço do processo |
O número hexadecimal de oito caracteres depois da palavra PROCESS é o endereço do bloco EPROCESS. Na entrada final do exemplo anterior, o endereço do processo é 0x809258E0. |
ID de processo (PID) |
O número hexadecimal depois da palavra Cid. Na entrada final no exemplo anterior, o PID é 0x44 ou decimal 68. |
Bloco de ambiente de processo (PEB) |
O número hexadecimal depois da palavra Peb é o endereço do bloco de ambiente de processo. Na entrada final do exemplo anterior, o PEB fica no endereço 0x7FFDE000. |
Processo Pai PID |
O número hexadecimal depois da palavra ParentCid é o PID do processo pai. Na entrada final do exemplo anterior, o PID do processo pai é 0x26 ou decimal 38. |
Imagem |
O nome do módulo que é o proprietário do processo. Na entrada final no exemplo anterior, o proprietário é spoolss.exe. Na primeira entrada, o proprietário é o sistema operacional em si. |
Endereço do objeto do processo |
O número hexadecimal depois da palavra ObjectTable. Na entrada final no exemplo anterior, o endereço do objeto do processo é 0x80925c68. |
Para ver detalhes completos sobre um processo, defina Sinalizadores como 7. O processo em si pode ser especificado definindo Process igual ao endereço do processo, configurando Process igual ao ID do processo ou configuração ImageName igual ao nome da imagem executável. Este é um exemplo:
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
Veja que o endereço do objeto de processo pode ser usado como entrada para outras extensões, como !handle, para obter mais informações.
A tabela a seguir aborda alguns dos elementos no exemplo anterior.
Element | Significado |
---|---|
COM TEMPO | O comentário entre parênteses depois deste título dá o motivo da espera. O comando dt nt!_KWAIT_REASON exibirá uma lista de todos os motivos de espera. |
ElapsedTime |
Lista a quantidade de tempo passado desde que o processo foi criado. Isso aparece em unidades de Horas:Minutos:Segundos.Milésimos de segundo. |
UserTime |
Lista a duração da execução do processo no modo de usuário. Se o valor para UserTime for excepcionalmente alto, ele poderá identificar um processo que está esgotando os recursos do sistema. As unidades são as mesmas de ElapsedTime. |
KernelTime |
Lista a duração da execução do processo no modo kernel. Se o valor para KernelTime for excepcionalmente alto, ele poderá identificar um processo que está esgotando os recursos do sistema. As unidades são as mesmas de ElapsedTime. |
Tamanhos do conjunto de trabalho |
Lista o tamanho presente, mínimo e máximo do conjunto de trabalho para o processo, em páginas. Um tamanho de conjunto de trabalho excepcionalmente grande pode ser um sinal de que um processo está vazando memória ou esgotando os recursos do sistema. |
Entradas QuotaPoolUsage |
Lista o pool paginado e não paginado utilizado pelo processo. Em um sistema com um vazamento de memória, buscar o uso excessivo de pool não paginado em todos os processos pode dizer qual processo tem o vazamento de memória. |
Clone |
Indica se o processo foi ou não foi criado pelos subsistemas POSIX ou Interix. |
Privados |
Indica o número de páginas privadas (não compartilháveis) que estão sendo utilizadas atualmente pelo processo. Isso inclui a memória paginada e paginada. |
Além das informações da lista de processos, as informações de thread contêm uma lista dos recursos em que o thread tem bloqueios. Estas informações são listadas na terceira linha de saída depois do cabeçalho do thread. Neste exemplo, o thread tem um bloqueio em um recurso, um SynchronizationEvent com endereço de 80144fc0. Comparando esse endereço com a lista de bloqueios mostrada pela extensão !kdext*.locks, você pode determinar quais threads têm bloqueios exclusivos em recursos.
A extensão !stacks fornece um breve resumo do estado de cada thread. Isso pode ser usado em vez da extensão !process para obter uma visão geral rápida do sistema, especialmente ao depurar problemas multithread, como conflitos de recursos ou deadlocks.