wt (seguimiento y inspección de datos)
El comando wt se ejecuta a través de toda la función y, a continuación, muestra las estadísticas, al ejecutar este comando al principio de una llamada de función.
wt [WatchOptions] [= StartAddress] [EndAddress]
Parámetros
WatchOptions
Especifica cómo modificar la presentación. Puede usar cualquiera de las siguientes opciones.
Opción | Efecto |
---|---|
-l Profundidad |
(Solo modo de usuario) Especifica la profundidad máxima de las llamadas que se van a mostrar. Las llamadas que sean al menos niveles de profundidad más profundas que el punto de partida se ejecutan silenciosamente. |
Módulo -m |
(Solo modo de usuario) Restringe la presentación al código dentro del módulo especificado, además del primer nivel de llamadas realizadas desde ese módulo. Puede incluir varias opciones de -m para mostrar código de varios módulos y ningún otro módulo. |
-i Module |
(Solo modo de usuario) Omite cualquier código dentro del módulo especificado. Puede incluir varias opciones de -i para omitir el código de varios módulos. Si usa una opción -m, el depurador omite todas las opciones de -i. |
-ni |
(Solo modo de usuario) No muestra ninguna entrada en el código que se omite debido a una opción -m o -i. |
-Nc |
No muestra información de llamada individual. |
-Ns |
No muestra información de resumen. |
-NW |
No muestra advertencias durante el seguimiento. |
-oa |
(Solo modo de usuario) Muestra la dirección real de los sitios de llamada. |
-or |
(Solo modo de usuario) Muestra los valores de registro devueltos de la función llamada, utilizando el radix predeterminado como base. |
-o |
(Solo modo de usuario) Muestra los valores de registro devueltos de la función llamada, en el tipo adecuado para cada valor devuelto. |
StartAddress
Especifica la dirección donde comienza la ejecución el depurador. Si no usa StartAddress, la ejecución comienza en la instrucción a la que apunta el puntero de instrucción. Para obtener más información sobre la sintaxis, consulte Direcciones y sintaxis de intervalo de direcciones.
EndAddress
Especifica la dirección donde finaliza el seguimiento. Si no usa EndAddress, se ejecuta una sola instrucción o llamada de función.
Entorno
Modos |
Modo de usuario, modo kernel |
Destinos |
Solo depuración en vivo |
Platforms |
Modo de usuario: todo el modo kernel: solo basado en x86 |
Información adicional
Para obtener más información sobre cómo emitir el comando wt y obtener información general sobre los comandos relacionados, vea Controlar el destino.
Comentarios
El comando wt es útil si desea obtener información sobre el comportamiento de una función específica, pero no desea recorrer paso a paso por la función. En su lugar, vaya al principio de esa función y, a continuación, emita el comando wt .
Si el contador del programa está en un punto que corresponde a un símbolo (como el principio de una función o un punto de entrada en un módulo), el comando wt realiza un seguimiento hasta que alcanza la dirección de retorno actual. Si el contador del programa está en una instrucción de llamada , el comando wt realiza un seguimiento hasta que vuelve a la ubicación actual. Este seguimiento se genera un perfil en la ventana Comando del depurador junto con la salida que describe las distintas llamadas que encuentra el comando.
Si el comando wt se emite en algún lugar distinto del principio de una función, el comando se comporta como el comando p (Paso). Sin embargo, si especifica EndAddress, la ejecución continúa hasta que se alcanza esa dirección, aunque esta ejecución implique muchos pasos de programa y llamadas de función.
Al depurar en modo de origen, debe realizar un seguimiento en la función solo hasta el punto en el que vea el corchete de apertura del cuerpo de la función. A continuación, puede usar el comando wt . (Normalmente es más fácil insertar un punto de interrupción en la primera línea de la función o usar Depuración | Ejecute en cursor y, a continuación, use el comando wt ).
Dado que la salida de wt puede ser larga, es posible que desee usar un archivo de registro para registrar la salida.
En el ejemplo siguiente se muestra un archivo de registro 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
En la lista del seguimiento, el primer número especifica el número de instrucciones que se ejecutaron, el segundo número especifica el número de instrucciones ejecutadas por procesos secundarios de la función y el tercer número (entre corchetes) especifica la profundidad de la función en la pila (tomando la función inicial como cero). La sangría del nombre de la función muestra la profundidad de la llamada.
En el ejemplo anterior, MyModule!myFunction ejecuta 105 instrucciones antes de llamar a varias subrutinas, incluidas printf y fgets, y luego ejecuta 54545 instrucciones adicionales después de llamar a esas funciones, pero antes de emitir algunas llamadas más. Sin embargo, en el recuento final, la pantalla muestra que myFunction ejecuta 112 379 instrucciones, ya que este recuento incluye todas las instrucciones que myFunction y sus elementos secundarios ejecutan. (Los elementos secundarios de myFunction son funciones a las que se llama desde myFunction, ya sea directa o indirectamente).
En el ejemplo anterior, tenga en cuenta también que ILT+1440 (__isatty) se llama 21 veces. En el recuento final, el resumen del comportamiento de esta función muestra el número de veces que se llamó, el menor número de instrucciones de cualquier ejecución única, el mayor número de instrucciones de cualquier ejecución única y el número medio de instrucciones por ejecución.
Si se realizan llamadas al sistema, aparecen en el contador y se muestran de nuevo al final de la salida del comando.