Partilhar via


Depuração de viagem no tempo - Reproduzir um rastreamento

Logótipo para depuração de viagem no tempo com um relógio.

Esta seção descreve como reproduzir traços de viagem no tempo, navegando para frente e para trás no tempo.

Comando navegação de viagem no tempo

Utilize um sinal de menos no final com os seguintes comandos para voltar no tempo.

Comando
p- (Passo atrás)
t- (Retrocesso)
g- (Voltar)

Para obter mais informações, consulte Depuração de viagem no tempo - Comandos de navegação.

Navegação no tempo através do botão da faixa

Como alternativa, use os botões da faixa de opções para navegar no traço.

Captura de ecrã dos botões Ir, Voltar, Passo e Passo atrás no friso.

Exemplo de Reprodução de Rastreio TTD

Utilize o comando g- para executar para trás até que um evento ou o início do traço TTD seja alcançado. Os eventos que podem parar a execução retroativa são os mesmos que interromperiam a execução para frente. Neste exemplo, o início do rastreamento é alcançado.

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 o comando p (Step) para avançar em um rastreamento 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]

Você também pode usar o comando t (Trace) para navegar no rastreamento.

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 o comando p- para retroceder em um rastreamento 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]

Você também pode usar o comando t- para navegar para trás no tempo.

!tt comandos de navegação

Use o comando !tt para avançar ou retroceder no tempo, saltando para uma determinada posição no rasto.

!tt [posição]

Forneça uma posição temporal em qualquer um dos seguintes formatos para viajar até aquele momento no tempo.

  • Se [position] é um número decimal entre 0 e 100, ele avança até aproximadamente essa percentagem ao longo do percurso. Por exemplo !tt 50 , viaja até a metade do traço.

  • Se {position} é #:#, onde # é um número hexadecimal, ele viaja para essa posição. Por exemplo, !tt 1A0:12F move-se para a posição 1A0:12F no traço.

Para obter mais informações, consulte Depuração de Viagem no Tempo - !tt (viagem no tempo).

!posições

Use !positions para exibir todos os threads ativos, incluindo sua posição no rastreamento. Para mais informações, consulte Time Travel Debugging - !positions (viagem no tempo).

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

Este exemplo mostra que há oito threads na posição atual. O segmento atual é 3604, marcado com '>'.

Sugestão

Outra maneira de exibir a lista atual de threads e suas posições, é usar o comando data model dx:

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

Use o comando user mode ~ (Thread Status) mostra os mesmos oito threads e marca o thread atual com '.':

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

Na saída do comando !positions, clique no link ao lado do terceiro thread (3FFC), para viajar no tempo até essa posição no rastreamento, 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 o comando ~ (Thread Status) para confirmar que agora estamos posicionados no terceiro thread, 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

Observação

O ~s#, onde # é um número de thread, também alterna para o thread fornecido, mas não altera a posição atual no rastreamento. Quando !tt é usado para viajar no tempo para a posição de outro thread, quaisquer valores que você (e o depurador) ler da memória serão pesquisados nessa posição. Ao alternar threads com ~s#, o depurador não altera internamente a posição atual, que é usada para todas as consultas de memória. Isso funciona dessa forma principalmente para que ~s# não precise redefinir o loop interno do depurador.

Comandos da extensão de depuração para viagem no tempo

Para obter informações sobre os comandos !tt, !positions e !index, consulte Depuração de Viagem no Tempo - Comandos de Extensão.

Ver também

Depuração de Time Travel - Visão Geral

Depuração de deslocamento temporal - Gravar um traço

Depuração Temporal - Trabalhando com ficheiros de rastreio

Depuração de viagem no tempo - Exemplo de passo a passo do aplicativo