Compartir a través de


Depuración de viajes de tiempo: reproducción de un seguimiento

Logotipo de depuración de viajes de tiempo con un reloj.

En esta sección se describe cómo reproducir seguimientos de viajes en tiempo, navegar hacia delante y hacia atrás en el tiempo.

Navegación de desplazamiento en tiempo de comandos

Use un signo menos final con los siguientes comandos para volver a viajar en el tiempo.

Get-Help
p- (Retroceder)
t- (Seguimiento atrás)
g- (Volver atrás)

Para obtener más información, vea Time Travel Debugging - Navigation commands(Depuración de viajes de tiempo: comandos de navegación).

Navegación de desplazamiento de tiempo del botón de la cinta

Como alternativa, use los botones de la cinta de opciones para navegar en el seguimiento.

Captura de pantalla de los botones Ir, Volver, Paso y Retroceder en la cinta de opciones.

Reproducción de seguimiento TTD de ejemplo

Use el comando g- para ejecutarse hacia atrás hasta que se alcance un evento o el principio del seguimiento TTD. Los eventos que pueden detener la ejecución hacia atrás son los mismos que detendrían la ejecución hacia delante. En este ejemplo, se alcanza el inicio del seguimiento.

0:000> g-
TTD: Start of trace reached.
(3f78.4274): Break instruction exception - code 80000003 (first/second chance not available)
Time Travel Position: 29:0
ntdll!ZwTestAlert+0x14:
00007ffc`61f789d4 c3              ret

Use el comando p (Paso) para avanzar en un seguimiento TTD.

0:000> p
Time Travel Position: F:1
ntdll!LdrpInitializeProcess+0x1bc5:
7774f828 740b            je      ntdll!LdrpInitializeProcess+0x1bd2 (7774f835) [br=1]
0:000> p
Time Travel Position: F:2
ntdll!LdrpInitializeProcess+0x1bd2:
7774f835 83bdd0feffff00  cmp     dword ptr [ebp-130h],0 ss:002b:010ff454=00000000
0:000> p
Time Travel Position: F:3
ntdll!LdrpInitializeProcess+0x1bd9:
7774f83c 0f8450e8ffff    je      ntdll!LdrpInitializeProcess+0x42f (7774e092) [br=1]

También puede usar el comando t (Trace) para navegar en el seguimiento.

0:000> t
Time Travel Position: F:4
ntdll!LdrpInitializeProcess+0x42f:
7774e092 33c0            xor     eax,eax
0:000> t
Time Travel Position: F:5
ntdll!LdrpInitializeProcess+0x431:
7774e094 e9f5170000      jmp     ntdll!LdrpInitializeProcess+0x1c2b (7774f88e)

Use el comando p- para retroceder hacia atrás en un seguimiento TTD.

0:000> p-
Time Travel Position: F:4
ntdll!LdrpInitializeProcess+0x42f:
7774e092 33c0            xor     eax,eax
0:000> p-
Time Travel Position: F:3
ntdll!LdrpInitializeProcess+0x1bd9:
7774f83c 0f8450e8ffff    je      ntdll!LdrpInitializeProcess+0x42f (7774e092) [br=1]

También puede usar el comando t- para navegar hacia atrás en el tiempo.

Comandos de navegación !tt

Use el comando !tt para navegar hacia delante o hacia atrás en el tiempo; para ello, omita una posición determinada en el seguimiento.

!tt [posición]

Proporcione una posición de tiempo en cualquiera de los siguientes formatos para viajar a ese momento dado.

  • Si [position] es un número decimal entre 0 y 100, viaja a aproximadamente ese porcentaje en el seguimiento. Por ejemplo !tt 50 , viaja a la mitad del seguimiento.

  • Si {position} es #:#, donde # es un número hexadecimal, viaja a esa posición. Por ejemplo, !tt 1A0:12F viaja a la posición 1A0:12F en el seguimiento.

Para obtener más información, vea Time Travel Debugging - !tt (time travel).

!Posiciones

Use !positions para mostrar todos los subprocesos activos, incluida su posición en el seguimiento. Para obtener más información, vea Time Travel Debugging - !positions (time travel)).

0:000> !positions
>*Thread ID=0x1C74 - Position: F:2
 Thread ID=0x1750 - Position: A5:0
 Thread ID=0x3FFC - Position: 200:0
 Thread ID=0x36B8 - Position: 403:0
 Thread ID=0x3BC4 - Position: 5F2:0
 Thread ID=0x392C - Position: B45:0
 Thread ID=0x32B4 - Position: C87:0
 Thread ID=0x337C - Position: DF1:0
* indicates an actively running thread

En este ejemplo se muestra que hay ocho subprocesos en la posición actual. El subproceso actual es 3604, marcado con ">".

Sugerencia

Otra manera de mostrar la lista actual de subprocesos y sus posiciones es usar el comando dx del modelo de datos:

dx -g @$curprocess.Threads.Select(t => new { IsCurrent = t.Id == @$curthread.Id, ThreadId = t.Id, Position = t.TTD.Position })

Use el comando modo de usuario ~ (Estado de subproceso) que muestra los mismos ocho subprocesos y marca el subproceso actual con '.':

0:000> ~
.  0  Id: 954.1c74 Suspend: 4096 Teb: 00fdb000 Unfrozen
   1  Id: 954.1750 Suspend: 4096 Teb: 00fea000 Unfrozen
   2  Id: 954.3ffc Suspend: 4096 Teb: 00fde000 Unfrozen
   3  Id: 954.36b8 Suspend: 4096 Teb: 00fe1000 Unfrozen
   4  Id: 954.3bc4 Suspend: 4096 Teb: 00fe4000 Unfrozen
   5  Id: 954.392c Suspend: 4096 Teb: 00fed000 Unfrozen
   6  Id: 954.32b4 Suspend: 4096 Teb: 00ff0000 Unfrozen
   7  Id: 954.337c Suspend: 4096 Teb: 00ff3000 Unfrozen

En la salida del comando !positions, haga clic en el vínculo situado junto al tercer subproceso (3FFC), para desplazarse a esa posición en el seguimiento, 200:0.

0:002> !tt 200:0
Setting position: 200:0
(954.3ffc): Break instruction exception - code 80000003 (first/second chance not available)
Time Travel Position: 200:0
ntdll!NtWaitForWorkViaWorkerFactory+0xc:
7775396c c21400          ret     14h

Use el comando ~ (Estado del subproceso) para confirmar que ahora estamos colocados en el tercer subproceso, 3ffc.

0:002> ~
   0  Id: 954.1c74 Suspend: 4096 Teb: 00fdb000 Unfrozen
   1  Id: 954.1750 Suspend: 4096 Teb: 00fea000 Unfrozen
.  2  Id: 954.3ffc Suspend: 4096 Teb: 00fde000 Unfrozen
   3  Id: 954.36b8 Suspend: 4096 Teb: 00fe1000 Unfrozen
   4  Id: 954.3bc4 Suspend: 4096 Teb: 00fe4000 Unfrozen
   5  Id: 954.392c Suspend: 4096 Teb: 00fed000 Unfrozen
   6  Id: 954.32b4 Suspend: 4096 Teb: 00ff0000 Unfrozen
   7  Id: 954.337c Suspend: 4096 Teb: 00ff3000 Unfrozen

Nota

~s#, donde # es un número de subproceso, también cambia al subproceso especificado, pero no cambia la posición actual en el seguimiento. Cuando se usa !tt para desplazarse por el tiempo a la posición de otro subproceso, los valores leídos (y el depurador) leídos de la memoria se buscarán en esa posición. Al cambiar de subprocesos con ~s#, el depurador no cambia internamente la posición actual, que se usa para todas las consultas de memoria. Esto funciona de esta manera principalmente para que ~s# no tenga que restablecer el bucle interno del depurador.

Comandos de extensión de depuración de recorrido de tiempo

Para obtener información sobre !tty !positions los !index comandos, vea Time Travel Debugging - Extension Commands.

Consulte también

Depuración de viajes de tiempo: información general

Depuración de viajes de tiempo: registro de un seguimiento

Depuración de viajes de tiempo: trabajar con archivos de seguimiento

Depuración de viajes en tiempo: tutorial de aplicación de ejemplo