.thread(레지스터 컨텍스트 설정)

.thread 명령은 레지스터 컨텍스트에 사용할 스레드를 지정합니다.

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

매개 변수

/p
(라이브 디버깅만 해당) 이 옵션이 포함되어 있고 스레드 가 0이 아닌 경우 이 스레드를 소유하는 프로세스에 대한 모든 전환 페이지 테이블 항목(PTE)은 액세스하기 전에 자동으로 실제 주소로 변환됩니다. 디버거가 이 프로세스에서 사용하는 모든 메모리에 대한 실제 주소를 조회해야 하고 디버그 케이블을 통해 상당한 양의 데이터를 전송해야 할 수 있으므로 이로 인해 속도가 느려질 수 있습니다. (이 동작은 .의 동작과 동일합니다. cache forcedecodeuser.)

/p 옵션이 포함되어 있고 스레드가 0이거나 생략된 경우 이 변환은 사용하지 않도록 설정됩니다. (이 동작은 .의 동작과 동일합니다. cache noforcedecodeuser.)

/r
(라이브 디버깅만 해당) /r 옵션이 /p 옵션과 함께 포함된 경우 프로세스 및 레지스터 컨텍스트가 설정된 후 이 스레드를 소유하는 프로세스에 대한 사용자 모드 기호가 다시 로드됩니다. (이 동작은 .의 동작과 동일합니다. /user를 다시 로드합니다.)

/P
(라이브 디버깅만 해당) 이 옵션이 포함되어 있고 스레드 가 0이 아닌 경우 액세스하기 전에 모든 전환 페이지 테이블 항목(PTE)이 자동으로 실제 주소로 변환됩니다. /p 옵션과 달리 이 스레드를 소유하는 프로세스뿐만 아니라 모든 사용자 모드 및 커널 모드 프로세스에 대한 PTE를 변환합니다. 디버거가 사용 중인 모든 메모리에 대한 실제 주소를 조회해야 하고 디버그 케이블을 통해 대량의 데이터를 전송해야 할 수 있으므로 이로 인해 속도가 느려질 수 있습니다. (이 동작은 .의 동작과 동일합니다. cache forcedecodeptes.)

/w
(64비트 커널 디버깅만 해당) 스레드의 활성 컨텍스트를 WOW64 32비트 컨텍스트로 변경합니다. 지정된 스레드가 WOW64 상태인 프로세스에서 실행 중이어야 합니다.

스레드
스레드의 주소입니다. 생략하거나 0이면 스레드 컨텍스트가 현재 스레드로 다시 설정됩니다.

환경

항목 설명
모드 커널 모드만
대상 라이브, 크래시 덤프
플랫폼 all

추가 정보

레지스터 컨텍스트 및 기타 컨텍스트 설정에 대한 자세한 내용은 컨텍스트 변경을 참조 하세요.

설명

일반적으로 커널 디버깅을 수행할 때 표시되는 레지스터는 현재 스레드와 연결된 레지스터뿐입니다.

.thread 명령은 커널 디버거에 지정된 스레드를 레지스터 컨텍스트로 사용하도록 지시합니다. 이 명령을 실행한 후 디버거는 이 스레드에 대한 가장 중요한 레지스터 및 스택 추적에 액세스할 수 있습니다. 이 레지스터 컨텍스트는 대상이 다른 레지스터 컨텍스트 명령(.thread, .cxr 또는 .trap)을 실행하거나 사용할 수 있도록 허용할 때까지 유지됩니다. 자세한 내용은 컨텍스트 등록을 참조하세요.

/w 옵션은 WOW64 상태가 있는 프로세스에서 실행되는 스레드의 64비트 커널 디버깅 세션에서만 사용할 수 있습니다. 검색된 컨텍스트는 WOW64에서 기억한 마지막 컨텍스트입니다. 이 코드는 일반적으로 Thread에서 실행되는 마지막 사용자 모드 코드입니다. 이 옵션은 대상이 네이티브 컴퓨터 모드인 경우에만 사용할 수 있습니다. 예를 들어 WOW64를 사용하여 x86 기반 프로세서를 에뮬레이트하는 64비트 컴퓨터에서 대상이 실행되는 경우 이 옵션을 사용할 수 없습니다. /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