Compartilhar via


.process (Definir contexto do processo)

O comando .process especifica que processo é usado para o contexto do processo.

.process [/i] [/p [/r]] [/P] [Process]

Parâmetros

/eu
Somente depuração ao vivo; não na depuração do kernel local) Especifica que Process deve ser depurado invasivamente. Esse tipo de depuração significa que o sistema operacional do computador de destino torna o processo especificado realmente ativo. (Sem essa opção, o comando .process altera a saída do depurador, mas não afeta o computador de destino em si.) Se você usar /i, use o comando g (Go) para executar o destino. Após vários segundos, o destino volta para o depurador e o Process especificado é ativo e usado para o contexto do processo.

/p
Converte todas as entradas de tabela de página de transição (PTEs) desse processo para endereços físicos antes do acesso, se você usar /p e Process for diferente de zero. Essa conversão pode causar lentidão, pois o depurador deve localizar os endereços físicos para toda a memória que esse processo usa. Além disso, o depurador pode ter que transferir uma quantidade significativa de dados pelo cabo de depuração. (Este é o mesmo comportamento do .cache forcedecodeuser.)

Se você incluir a opção /p e Process for zero ou você omiti-lo, a conversão será desabilitada. (Este comportamento é o mesmo do .cache noforcedecodeptes.)

/r
Recarrega símbolos de modo de usuário após o contexto do processo ter sido definido, se você usar as opções /r e /p. (Este é o mesmo comportamento do .reload /user.)

/P
(Somente a depuração ao vivo e os despejos de memória completos) Converte todas as entradas de tabela de página de transição (PTEs) para endereços físicos antes do acesso, se você usar /P e Process for diferente de zero. Ao contrário da opção /p, a opção /P converte os PTEs para todos os processos de modo de usuário e modo kernel, não somente o processo que possui esse thread. Essa conversão pode causar lentidão, pois o depurador deve encontrar os endereços físicos de toda a memória em uso. Além disso, o depurador pode precisar transferir muitos dados pelo cabo de depuração. (Este comportamento é o mesmo do .cache forcedecodeptes.)

Processo
Especifica o endereço do processo que você quer. (Mais precisamente, este parâmetro especifica o endereço do bloco EPROCESS para esse processo). O contexto do processo é definido para o processo. Se você omitir Process ou especificar zero, o contexto do processo será retornado ao processo padrão para o estado atual do sistema. (Se você usou a opção /i para definir o contexto do processo, use a a opção /i para redefinir o contexto do processo.)

Ambiente

Item Descrição
Modos somente no modo kernel
Destinos ao vivo, despejo de memória
Plataformas all

Informações Adicionais

Para mais informações sobre o contexto de processo e outras configurações de contexto, consulte Como alterar contextos.

Comentários

Normalmente, quando você faz a depuração do kernel, o único espaço de endereço visível no modo de usuário é aquele associado ao processo atual.

O comando .process instrui o depurador do kernel a usar um processo de modo de usuário específico como o contexto do processo. Esse uso tem diversos efeitos, mas o mais importante é que o depurador tenha acesso ao espaço de endereço virtual desse processo. O depurador usa as tabelas de página para esse processo de modo a interpretar todos os endereços de memória de modo de usuário, para você poder ler e gravar nessa memória.

O comando .context (Definir contexto de endereço no modo de usuário) tem um efeito parecido. No entanto, o comando .context define o contexto de endereço no modo de usuário para um diretório de página específico, enquanto o comando .process define o contexto do processo para um processo específico. Em um processador com base em x86, .context e .process têm quase o mesmo efeito. Porém, em um processador com base em Itanium, um único processo pode ter mais de um diretório de página. Nesse caso, o comando .process é mais eficiente, pois ele permite o acesso a todos os diretórios de página associados a um processo. Para mais informações sobre o contexto do processo, consulte Contexto do processo.

Observação Se estiver executando depuração ao vivo, você deverá usar o parâmetro /i ou /p. Sem um desses parâmetros, você não pode ver corretamente o modo de usuário ou a memória de sessão.

O parâmetro /i ativa o processo de destino. Ao usar essa opção, execute o destino uma vez para que esse comando entre em vigor. Se executar novamente, o contexto do processo será perdido.

O parâmetro /p habilita a configuração forcedecodeuser. (Você não precisa usar /p se a opção forcedecodeuser já está ativa.) O contexto do processo e o estado forcedecodeuser permanecem somente até que o alvo seja executado novamente.

Se você estiver executando a depuração de despejo de falha, as opções /i e /p não ficarão disponíveis. Porém, você não pode acessar nenhuma parte do espaço de endereço virtual do processo de modo de usuário que foram paginados para o disco quando ocorreu a falha.

Se você quiser usar o depurador do kernel para definir pontos de interrupção no espaço do usuário, use a opção /i para alternar o destino ao contexto de processo correto.

O exemplo seguinte mostra como usar a extensão !process para encontrar o endereço do bloco EPROCESS para o processo desejado.

kd> !process 0 0
**** NT ACTIVE PROCESS DUMP ****
PROCESS fe5039e0  SessionId: 0  Cid: 0008    Peb: 00000000  ParentCid: 0000
    DirBase: 00030000  ObjectTable: fe529b68  TableSize:  50.
    Image: System

.....

PROCESS fe3c0d60  SessionId: 0  Cid: 0208    Peb: 7ffdf000  ParentCid: 00d4
    DirBase: 0011f000  ObjectTable: fe3d0f48  TableSize:  30.
    Image: regsvc.exe

Agora, o exemplo usa o comando .process om esse endereço de processo.

kd> .process fe3c0d60
Implicit process is now fe3c0d60

Observe que esse comando torna o comando .context desnecessário. O contexto do endereço de modo de usuário já tem o valor desejado.

kd> .context 
User-mode page directory base is 11f000

Esse valor que você examine o espaço de endereço de várias maneiras. Por exemplo, o exemplo a seguir mostra a saída da extensão !peb.

kd> !peb
PEB at 7FFDF000
    InheritedAddressSpace:    No
    ReadImageFileExecOptions: No
    BeingDebugged:            No
    ImageBaseAddress:         01000000
    Ldr.Initialized: Yes
    Ldr.InInitializationOrderModuleList: 71f40 . 77f68
    Ldr.InLoadOrderModuleList: 71ec0 . 77f58
    Ldr.InMemoryOrderModuleList: 71ec8 . 77f60
        01000000 C:\WINNT\system32\regsvc.exe
        77F80000 C:\WINNT\System32\ntdll.dll
        77DB0000 C:\WINNT\system32\ADVAPI32.dll
        77E80000 C:\WINNT\system32\KERNEL32.DLL
        77D40000 C:\WINNT\system32\RPCRT4.DLL
        77BE0000 C:\WINNT\system32\secur32.dll
    SubSystemData:     0
    ProcessHeap:       70000
    ProcessParameters: 20000
        WindowTitle: "'C:\WINNT\system32\regsvc.exe'"
        ImageFile:    'C:\WINNT\system32\regsvc.exe'
        CommandLine:  'C:\WINNT\system32\regsvc.exe'
        DllPath:     'C:\WINNT\system32;.;C:\WINNT\System32;C:\WINNT\system;C:\WINNT;C:\WINNT\system32;C:\WINNT;C:\WINNT\System32\Wbem;C:\PROGRA~1\COMMON~1\AUTODE~1'
        Environment:  0x10000