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.