Compartilhar via


Depuração de Viagem no Tempo – Reproduzir um rastreamento

Logotipo de depuração de viagem no tempo com um relógio.

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

Navegação de viagem no tempo de comando

Use um sinal de subtração à direita com os comandos a seguir para voltar no tempo.

Comando
p- (Step Back)
t- (Trace Back)
g- (Voltar)

Para obter mais informações, consulte Comandos de Depuração de Viagem no Tempo – Navegação.

Navegação de viagem no tempo do botão da faixa de opções

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

Captura de tela dos botões Go, Go Back, Step e Step back na faixa de opções.

Exemplo de reprodução de rastreamento TTD

Use o comando g- para executar com versões anteriores até que um evento ou o início do rastreamento TTD seja atingido. Os eventos que podem interromper a execução com versões anteriores são os mesmos que interromperiam a execução. Neste exemplo, o início do rastreamento é atingido.

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 (Etapa) 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 (Rastreamento) 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.

Comandos de navegação !tt

Use o comando !tt para navegar para frente ou para trás no tempo, ignorando para uma determinada posição no rastreamento.

!tt [posição]

Forneça uma posição de tempo em qualquer um dos seguintes formatos para viajar para esse ponto no tempo.

  • Se [posição] for um número decimal entre 0 e 100, ele viajará para aproximadamente esse percentual para o rastreamento. Por exemplo !tt 50 , viaja para a metade do rastreamento.

  • Se {position} for #:#, em que # são números hexadecimal, ele viajará para essa posição. Por exemplo, !tt 1A0:12F viaja para posicionar 1A0:12F no rastreamento.

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 obter mais informações, consulte Depuração de Viagem no Tempo – !posições (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 thread atual é 3604, marcado com '>'.

Dica

Outra maneira de exibir a lista atual de threads e suas posições é usar o comando dx do modelo de dados:

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

Use o comando modo de usuário ~ (Status do Thread) 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 para 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 ~ (Status do Thread) 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#, em que # é 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, todos os valores que você (e o depurador) lerem da memória serão examinados nessa posição. Ao alternar threads com ~s#, o depurador não altera a posição atual internamente, que é usada para todas as consultas de memória. Isso funciona dessa maneira principalmente para que ~s# não precise redefinir o loop interno do depurador.

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

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

Consulte Também

Depuração de viagem no tempo – Visão geral

Depuração de Viagem no Tempo – Registrar um rastreamento

Depuração de Viagem no Tempo – Trabalhando com arquivos de rastreamento

Depuração de viagem no tempo – Passo a passo do aplicativo de exemplo