Compartilhar via


wt (Dados de rastreamento e observação)

O comando wt é executado por toda a função e, em seguida, exibe estatísticas, quando você executa esse comando no início de uma chamada de função.

wt [WatchOptions] [= StartAddress] [EndAddress] 

Parâmetros

Opções de relógio
Especifica como modificar a exibição. Você pode usar qualquer uma das opções a seguir.

Opção Efeito

-l Profundidade

(Somente modo de usuário) Especifica a profundidade máxima das chamadas a serem exibidas. Todas as chamadas que são pelo menos níveis de profundidade mais profundos do que o ponto de partida são executadas silenciosamente.

Módulo -m

(Somente modo de usuário) Restringe a exibição ao código dentro do módulo especificado, além do primeiro nível de chamadas feitas a partir desse módulo. Você pode incluir várias opções -m para exibir código de vários módulos e nenhum outro módulo.

-i Módulo

(Somente modo de usuário) Ignora qualquer código dentro do módulo especificado. Você pode incluir várias opções -i para ignorar o código de vários módulos. Se você usar uma opção -m, o depurador ignorará todas as opções -i.

-Ni

(Somente modo de usuário) Não exibe nenhuma entrada no código que está sendo ignorada devido a uma opção -m ou -i.

-Nc

Não exibe informações de chamadas individuais.

-Ns

Não exibe informações resumidas.

-NW

Não exibe avisos durante o rastreamento.

-Oa

(Somente modo de usuário) Exibe o endereço real dos sites de chamada.

-or

(Somente modo de usuário) Exibe os valores de registro de retorno da função chamada, usando a base padrão como base.

-ou

(Somente modo de usuário) Exibe os valores de registro de retorno da função chamada, no tipo apropriado para cada valor de retorno.

Endereço inicial
Especifica o endereço em que o depurador inicia a execução. Se você não usar StartAddress, a execução terá início na instrução para a qual o ponteiro de instrução está apontando. Para obter mais informações sobre a sintaxe, consulte Endereço e sintaxe de intervalo de endereços.

Endereço final
Especifica o endereço onde o rastreamento termina. Se você não usar EndAddress, uma única instrução ou chamada de função será executada.

Ambiente

Modos

Modo de usuário, modo kernel

Destinos

Somente depuração ao vivo

Plataformas

Modo de usuário: todos Modo kernel: somente baseado em x86

Informações Adicionais

Para obter mais informações sobre como emitir o comando wt e uma visão geral dos comandos relacionados, consulte Controlando o destino.

Comentários

O comando wt é útil se você quiser informações sobre o comportamento de uma função específica, mas não quiser percorrer a função. Em vez disso, vá para o início dessa função e emita o comando wt .

Se o contador do programa estiver em um ponto que corresponda a um símbolo (como o início de uma função ou ponto de entrada em um módulo), o comando wt rastreará até atingir o endereço de retorno atual. Se o contador do programa estiver em uma instrução de chamada, o comando wt rastreará até retornar ao local atual. Esse rastreamento é analisado na janela Comando do Depurador junto com a saída que descreve as várias chamadas que o comando encontra.

Se o comando wt for emitido em algum lugar diferente do início de uma função, o comando se comportará como o comando p (Step). No entanto, se você especificar EndAddress, a execução continuará até que esse endereço seja alcançado, mesmo que essa execução envolva muitas etapas do programa e chamadas de função.

Ao depurar no modo de origem, você deve rastrear a função somente até o ponto em que vê o colchete de abertura do corpo da função. Em seguida, você pode usar o comando wt . (Normalmente, é mais fácil inserir um ponto de interrupção na primeira linha da função ou usar Depurar | Execute até o cursor e use o comando wt .)

Como a saída de wt pode ser longa, talvez você queira usar um arquivo de log para registrar sua saída.

O exemplo a seguir mostra um arquivo de log típico.

0:000> l+                  Source options set to show source lines
Source options are f:
     1/t - Step/trace by source line
     2/l - List source line for LN and prompt
     4/s - List source code at prompt
     8/o - Only show source code at prompt
0:000> p                   Not yet at the function call: use "p"
>  44:       minorVariableOne = 12;
0:000> p
>  45:       variableOne = myFunction(2, minorVariable);
0:000> t                   At the function call: now use "t"
MyModule!ILT+10(_myFunction):
0040100f e9cce60000      jmp     MyModule!myFunction (0040f6e0)
0:000> t
>  231:    { 
0:000> wt                  At the function beginning:  now use "wt"
Tracing MyModule!myFunction to return address 00401137

  105     0 [  0] MyModule!myFunction
    1     0 [  1]   MyModule!ILT+1555(_printf)
    9     0 [  1]   MyModule!printf
    1     0 [  2]     MyModule!ILT+370(__stbuf)
   11     0 [  2]     MyModule!_stbuf
    1     0 [  3]       MyModule!ILT+1440(__isatty)
   14     0 [  3]       MyModule!_isatty
   50    15 [  2]     MyModule!_stbuf
   17    66 [  1]   MyModule!printf
    1     0 [  2]     MyModule!ILT+980(__output)
   59     0 [  2]     MyModule!_output
   39     0 [  3]       MyModule!write_char
  111    39 [  2]     MyModule!_output
   39     0 [  3]       MyModule!write_char

....

   11     0 [  5]           kernel32!__SEH_epilog4
   54 11675 [  4]         kernel32!ReadFile
  165 11729 [  3]       MyModule!_read
  100 11895 [  2]     MyModule!_filbuf
   91 11996 [  1]   MyModule!fgets
54545 83789 [  0] MyModule!myFunction
    1     0 [  1]   MyModule!ILT+1265(__RTC_CheckEsp)
    2     0 [  1]   MyModule!_RTC_CheckEsp
54547 83782 [  0] MyModule!myFunction

112379 instructions were executed in 112378 events (0 from other threads)

Function Name                               Invocations MinInst MaxInst AvgInst
MyModule!ILT+1265(__RTC_CheckEsp)                     1       1       1       1
MyModule!ILT+1440(__isatty)                          21       1       1       1
MyModule!ILT+1540(__ftbuf)                           21       1       1       1
....
ntdll!memcpy                                         24       1      40      19
ntdll!memset                                          2      29      29      29

23 system calls were executed

Calls  System Call
   23  ntdll!KiFastSystemCall

Na listagem do rastreamento, o primeiro número especifica o número de instruções que foram executadas, o segundo número especifica o número de instruções executadas por processos filho da função e o terceiro número (entre parênteses) especifica a profundidade da função na pilha (tomando a função inicial como zero). O recuo do nome da função mostra a profundidade da chamada.

No exemplo anterior, MyModule!myFunction executa 105 instruções antes de chamar várias sub-rotinas, incluindo printf e fgets, e executa 54545 instruções adicionais depois de chamar essas funções, mas antes de emitir mais algumas chamadas. No entanto, na contagem final, a exibição mostra que myFunction executa 112.379 instruções, pois essa contagem inclui todas as instruções que myFunction e seus filhos executam. (Os filhos de myFunction são funções chamadas de myFunction, direta ou indiretamente.)

No exemplo anterior, observe também que ILT+1440 (__isatty) é chamado 21 vezes. Na contagem final, o resumo do comportamento dessa função mostra o número de vezes que ela foi chamada, o menor número de instruções em uma única execução, o maior número de instruções em uma única execução e o número médio de instruções por execução.

Se alguma chamada do sistema for feita, ela aparecerá no contador e será listada novamente no final da saída do comando.