Отладка перемещения по времени — воспроизведение трассировки
В этом разделе описывается воспроизведение трассировок перемещения по времени, навигация вперед и назад во времени.
Навигация по времени команды
Используйте конечный знак "минус" со следующими командами для перемещения назад во времени.
Get-Help |
---|
p- (шаг назад) |
t- (обратная трассировка) |
g- (вернуться) |
Дополнительные сведения см. в разделе Отладка перемещения по времени — команды навигации.
Навигация по времени на кнопке ленты
Кроме того, можно использовать кнопки ленты для навигации по трассировке.
Пример воспроизведения трассировки TTD
Используйте команду g- для выполнения в обратном направлении, пока не будет достигнуто событие или начало трассировки TTD. События, которые могут остановить обратное выполнение, совпадают с тем, что останавливает выполнение вперед. В этом примере достигается начало трассировки.
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
Используйте команду p (шаг), чтобы выполнить шаг вперед в трассировке 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]
Для навигации по трассировке также можно использовать команду t (Trace ).
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)
Используйте команду p-, чтобы выполнить шаг назад в трассировке 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]
Вы также можете использовать команду t-, чтобы перемещаться назад во времени.
Команды навигации !tt
Используйте команду !tt для перемещения вперед или назад во времени, пропуская заданную позицию в трассировке.
!tt [позиция]
Укажите позицию времени в любом из следующих форматов для перемещения к этой точке во времени.
Если [position] является десятичным числом в диапазоне от 0 до 100, оно перемещается примерно до этого процента в трассировку. Например,
!tt 50
перемещается на полпути через трассировку.Если {position} имеет значение #:#, где # — шестнадцатеричные числа, он перемещается в эту позицию. Например,
!tt 1A0:12F
перемещается в позицию 1A0:12F в трассировке.
Дополнительные сведения см. в разделе Отладка перемещения по времени — !tt (перемещение по времени).
!Позиции
Используйте !positions
для отображения всех активных потоков, включая их положение в трассировке. Дополнительные сведения см. в разделе Отладка перемещения по времени — !позиции (перемещение по времени).
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
В этом примере показано, что в текущей позиции находится восемь потоков. Текущий поток — 3604, помеченный символом ">".
Совет
Другой способ отображения текущего списка потоков и их позиций — использовать команду data model dx:
dx -g @$curprocess.Threads.Select(t => new { IsCurrent = t.Id == @$curthread.Id, ThreadId = t.Id, Position = t.TTD.Position })
Используйте команду пользовательского режима ~ (состояние потока) и отображает те же восемь потоков и помечает текущий поток следующим образом:
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
В выходных данных команды !position щелкните ссылку рядом с третьим потоком (3FFC), чтобы перейти к этой позиции трассировки, 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
Используйте команду ~ (состояние потока), чтобы убедиться, что мы располагаемся в третьем потоке, 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
Примечание
~s#, где # — номер потока, также переключается на данный поток, но не изменяет текущую позицию в трассировке. Если !tt используется для перемещения по времени в положение другого потока, все значения, которые вы (и отладчик) считываете из памяти, будут искаться в этой позиции. При переключении потоков с помощью ~s#отладчик не изменяет текущую позицию внутри системы, которая используется для всех запросов к памяти. Это работает в первую очередь таким образом, чтобы ~s# не нужно сбрасывать внутренний цикл отладчика.
Команды расширения отладки перемещения по времени
Сведения о командах !tt
и !positions
см. в разделе Отладка!index
перемещения по времени — команды расширения.
См. также:
Отладка перемещения по времени — обзор
Отладка перемещения по времени — запись трассировки
Отладка перемещения по времени — работа с файлами трассировки
Отладка по времени — пошаговое руководство по примеру приложения