.thread (настройка контекста регистрации)

Команда .thread указывает, какой поток будет использоваться для контекста регистрации.

.thread [/p [/r] ] [/P] [/w] [Thread]

Параметры

/p
(только для динамической отладки) Если этот параметр включен и поток не является ненулевой, все записи таблицы страницы перехода (PTEs) для процесса владения этим потоком будут автоматически преобразованы в физические адреса перед доступом. Это может привести к замедлению, так как отладчику придется искать физические адреса для всей памяти, используемой этим процессом, и значительное количество данных может потребоваться передать по отладочному кабелю. (Это поведение совпадает с поведением. cache forcedecodeuser.)

Если параметр /p включен и поток равен нулю или опущен, этот перевод будет отключен. (Это поведение совпадает с поведением. cache noforcedecodeuser.)

/R
(только для динамической отладки) Если параметр /r включен вместе с параметром /p , символы пользовательского режима для процесса владения этим потоком будут перезагружены после установки контекстов процесса и регистрации. (Это поведение совпадает с поведением. перезагрузить /user.)

/P
(только для динамической отладки) Если этот параметр включен и поток не является ненулевой, все записи таблицы страниц перехода (PTEs) будут автоматически преобразованы в физические адреса перед доступом. В отличие от параметра /p, это преобразует PTEs для всех процессов пользовательского и ядра, а не только для процесса владения этим потоком. Это может привести к замедлению, так как отладчику придется искать физические адреса для всей используемой памяти, и может потребоваться передать огромное количество данных по отладочному кабелю. (Это поведение совпадает с поведением. cache forcedecodeptes.)

/w
(только 64-разрядная отладка ядра) Изменяет активный контекст для потока в 32-разрядный контекст WOW64. Указанный поток должен выполняться в процессе с состоянием WOW64.

Поток
Адрес потока. Если это опущено или ноль, контекст потока сбрасывается в текущий поток.

Среда

Позиция Description
Режимы Только режим ядра
Целевые объекты live, аварийное дампа
Платформы all

Дополнительная информация

Дополнительные сведения о контексте регистрации и других параметрах контекста см. в разделе "Изменение контекстов".

Замечания

Как правило, при отладке ядра только видимые регистры связаны с текущим потоком.

Команда .thread указывает отладчику ядра использовать указанный поток в качестве контекста регистра. После выполнения этой команды отладчик получит доступ к наиболее важным регистрам и трассировке стека для этого потока. Этот контекст регистра сохраняется, пока целевой объект не будет выполнять или использовать другую команду контекста регистра (.thread, CXR или .trap). Полные сведения см. в разделе "Регистрировать контекст ".

Параметр /w можно использовать только в 64-разрядных сеансах отладки ядра в потоке, работающем в процессе с состоянием WOW64. Полученный контекст будет последним контекстом, запоминаемым WOW64; Обычно это последний код пользовательского режима, выполняемый Thread. Этот параметр можно использовать только в том случае, если целевой объект находится в собственном режиме компьютера. Например, если целевой объект работает на 64-разрядном компьютере, который эмулирует процессор на основе x86 с помощью WOW64, этот параметр нельзя использовать. Использование параметра /w приведет к автоматическому переключении режима компьютера на процессор на основе x86.

Эта команда фактически не изменяет текущий поток. Другими словами, расширения, такие как !thread и !teb по-прежнему по умолчанию для текущего потока, если с ними не используются аргументы.

Ниже приведен пример. Используйте расширение !process для поиска адреса требуемого потока. (В этом случае !process 0 0 используется для перечисления всех процессов, то !process используется второй раз для перечисления всех потоков для требуемого процесса.)

kd> !process 0 0
**** NT ACTIVE PROCESS DUMP ****
PROCESS fe5039e0  SessionId: 0  Cid: 0008    Peb: 00000000  ParentCid: 0000
    DirBase: 00030000  ObjectTable: fe529a88  TableSize: 145.
    Image: System

.....

PROCESS ffaa5280  SessionId: 0  Cid: 0120    Peb: 7ffdf000  ParentCid: 01e0
    DirBase: 03b70000  ObjectTable: ffaa4e48  TableSize:  23.
    Image: winmine.exe

kd> !process ffaa5280
PROCESS ffaa5280  SessionId: 0  Cid: 0120    Peb: 7ffdf000  ParentCid: 01e0
    DirBase: 03b70000  ObjectTable: ffaa4e48  TableSize:  23.
    Image: winmine.exe
    VadRoot ffaf6e48 Clone 0 Private 50. Modified 0. Locked 0.
    DeviceMap fe502e88
    Token                             e1b55d70

.....

        THREAD ffaa43a0  Cid 120.3a4  Teb: 7ffde000  Win32Thread: e1b4fea8 WAIT: (WrUserRequest) UserMode Non-Alertable
            ffadc6a0  SynchronizationEvent
        Not impersonating
        Owning Process ffaa5280
        WaitTime (seconds)      24323
        Context Switch Count    494                   LargeStack

.....

Теперь используйте команду .thread с адресом требуемого потока. Это задает контекст регистрации и позволяет проверять важные регистры и стек вызовов для этого потока.

kd> .thread ffaa43a0
Using context of thread ffaa43a0

kd> r
Last set context:
eax=00000000 ebx=00000000 ecx=00000000 edx=00000000 esi=00000000 edi=00000000
eip=80403a0d esp=fd581c2c ebp=fd581c60 iopl=0         nv up di pl nz na pe nc
cs=0000  ss=0000  ds=0000  es=0000  fs=0000  gs=0000             efl=00000000
0000:3a0d ??              ???

kd> k
  *** Stack trace for last set context - .thread resets it
ChildEBP RetAddr  
fd581c38 8042d61c ntoskrnl!KiSwapThread+0xc5
00001c60 00000000 ntoskrnl!KeWaitForSingleObject+0x1a1