Поделиться через


Отладка перемещения по времени — воспроизведение трассировки

Логотип отладки перемещения по времени с часами.

В этом разделе описывается воспроизведение трассировок перемещения по времени, навигация вперед и назад во времени.

Навигация по времени команды

Используйте конечный знак "минус" со следующими командами для перемещения назад во времени.

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 перемещения по времени — команды расширения.

См. также:

Отладка перемещения по времени — обзор

Отладка перемещения по времени — запись трассировки

Отладка перемещения по времени — работа с файлами трассировки

Отладка по времени — пошаговое руководство по примеру приложения