Depuração de Viagem no Tempo – Reproduzir um rastreamento
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.
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 !tt
e 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