Compartilhar via


!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.