영어로 읽기

다음을 통해 공유


.process(프로세스 컨텍스트 설정)

.process 명령은 프로세스 컨텍스트에 사용되는 프로세스를 지정합니다.

.process [/i] [/p [/r]] [/P] [Process]

매개 변수

/나는
라이브 디버깅만 해당; 로컬 커널 디버깅 중이 아님) 프로세스를 침습적으로 디버깅하도록 지정합니다. 이러한 종류의 디버깅은 대상 컴퓨터의 운영 체제가 실제로 지정된 프로세스를 활성화한다는 것을 의미합니다. (이 옵션이 없으면 .process 명령은 디버거의 출력을 변경하지만 대상 컴퓨터 자체에는 영향을 주지 않습니다.) /i를 사용하는 경우 g(Go) 명령을 사용하여 대상을 실행해야 합니다. 몇 초 후에 대상이 디버거로 다시 침입하고 지정된 프로세스가 활성 상태이며 프로세스 컨텍스트에 사용됩니다.

/p
/p 를 사용하고 프로세스가 0이 아닌 경우 액세스하기 전에 이 프로세스의 모든 전환 페이지 테이블 항목(PTE)을 실제 주소로 변환합니다. 디버거가 이 프로세스에서 사용하는 모든 메모리에 대한 실제 주소를 찾아야 하기 때문에 이 변환으로 인해 속도가 느려질 수 있습니다. 또한 디버거는 디버그 케이블을 통해 상당한 양의 데이터를 전송해야 할 수 있습니다. (이 동작은 . cache forcedecodeuser.)

/p 옵션을 포함하고 Process가 0이거나 생략하면 변환이 비활성화됩니다. (이 동작은 . 캐시 noforcedecodeptes.)

/r
/r/p 옵션을 사용하는 경우 프로세스 컨텍스트가 설정된 후 사용자 모드 기호를 다시 로드합니다. (이 동작은 . /user를 다시 로드합니다.)

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

프로세스
원하는 프로세스의 주소를 지정합니다. 보다 정확하게 말하자면, 이 매개 변수는 이 프로세스에 대한 EPROCESS 블록의 주소를 지정합니다. 프로세스 컨텍스트가 이 프로세스로 설정됩니다. 프로세스를 생략하거나 0을 지정하면 프로세스 컨텍스트가 현재 시스템 상태의 기본 프로세스로 다시 설정됩니다. (/i 옵션을 사용하여 프로세스 컨텍스트를 설정한 경우 /i 옵션을 사용하여 프로세스 컨텍스트를 다시 설정해야 합니다.)

환경

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

추가 정보

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

설명

일반적으로 커널 디버깅을 수행할 때 표시되는 유일한 사용자 모드 주소 공간은 현재 프로세스와 연결된 공간입니다.

.process 명령은 커널 디버거에 특정 사용자 모드 프로세스를 프로세스 컨텍스트사용하도록 지시합니다. 이 사용은 여러 가지 영향을 주지만 가장 중요한 것은 디버거가 이 프로세스의 가상 주소 공간에 액세스할 수 있다는 것입니다. 디버거는 이 프로세스에 대한 페이지 테이블을 사용하여 모든 사용자 모드 메모리 주소를 해석하므로 이 메모리를 읽고 쓸 수 있습니다.

.context(사용자 모드 주소 컨텍스트 설정) 명령도 비슷한 효과를 줍니다. 그러나 .context 명령은 사용자 모드 주소 컨텍스트를 특정 페이지 디렉터리로 설정하고 .process 명령은 프로세스 컨텍스트를 특정 프로세스로 설정합니다. x86 기반 프로세서에서 .context.process 는 거의 동일한 효과를 갖습니다. 그러나 Itanium 기반 프로세서에서는 단일 프로세스에 둘 이상의 페이지 디렉터리가 있을 수 있습니다. 이 경우 .process 명령은 프로세스와 연결된 모든 페이지 디렉터리에 액세스할 수 있으므로 더 강력합니다. 프로세스 컨텍스트에 대한 자세한 내용은 프로세스 컨텍스트를 참조 하세요.

참고 라이브 디버깅을 수행하는 경우 /i 또는 /p 매개 변수를 사용해야 합니다. 이러한 매개 변수 중 하나가 없으면 사용자 모드 또는 세션 메모리를 올바르게 표시할 수 없습니다.

/i 매개 변수는 대상 프로세스를 활성화합니다. 이 옵션을 사용하는 경우 이 명령을 적용하려면 대상을 한 번 실행해야 합니다. 다시 실행하면 프로세스 컨텍스트가 손실됩니다.

/p 매개 변수를 사용하면 forcedecodeuser 설정을 사용할 수 있습니다. (forcedecodeuser 옵션이 이미 활성 상태인 경우 /p를 사용할 필요가 없습니다.) 프로세스 컨텍스트 및 forcedecodeuser 상태는 대상이 다시 실행될 때까지만 유지됩니다.

크래시 덤프 디버깅을 수행하는 경우 /i/p 옵션을 사용할 수 없습니다. 그러나 충돌이 발생했을 때 디스크에 페이징된 사용자 모드 프로세스의 가상 주소 공간에는 액세스할 수 없습니다.

커널 디버거를 사용하여 사용자 공간에서 중단점을 설정하려면 /i 옵션을 사용하여 대상을 올바른 프로세스 컨텍스트로 전환합니다.

다음 예제에서는 !process 확장을 사용하여 원하는 프로세스 에 대한 EPROCESS 블록의 주소를 찾는 방법을 보여 줍니다.

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

.....

PROCESS fe3c0d60  SessionId: 0  Cid: 0208    Peb: 7ffdf000  ParentCid: 00d4
    DirBase: 0011f000  ObjectTable: fe3d0f48  TableSize:  30.
    Image: regsvc.exe

이제 예제에서는 이 프로세스 주소와 함께 .process 명령을 사용합니다.

kd> .process fe3c0d60
Implicit process is now fe3c0d60

이 명령은 .context 명령을 불필요하게 만듭니다. 사용자 모드 주소 컨텍스트에 이미 원하는 값이 있습니다.

kd> .context 
User-mode page directory base is 11f000

이 값을 사용하면 다양한 방법으로 주소 공간을 검사할 수 있습니다. 예를 들어 다음 예제에서는 !peb 확장의 출력을 보여줍니다.

kd> !peb
PEB at 7FFDF000
    InheritedAddressSpace:    No
    ReadImageFileExecOptions: No
    BeingDebugged:            No
    ImageBaseAddress:         01000000
    Ldr.Initialized: Yes
    Ldr.InInitializationOrderModuleList: 71f40 . 77f68
    Ldr.InLoadOrderModuleList: 71ec0 . 77f58
    Ldr.InMemoryOrderModuleList: 71ec8 . 77f60
        01000000 C:\WINNT\system32\regsvc.exe
        77F80000 C:\WINNT\System32\ntdll.dll
        77DB0000 C:\WINNT\system32\ADVAPI32.dll
        77E80000 C:\WINNT\system32\KERNEL32.DLL
        77D40000 C:\WINNT\system32\RPCRT4.DLL
        77BE0000 C:\WINNT\system32\secur32.dll
    SubSystemData:     0
    ProcessHeap:       70000
    ProcessParameters: 20000
        WindowTitle: "'C:\WINNT\system32\regsvc.exe'"
        ImageFile:    'C:\WINNT\system32\regsvc.exe'
        CommandLine:  'C:\WINNT\system32\regsvc.exe'
        DllPath:     'C:\WINNT\system32;.;C:\WINNT\System32;C:\WINNT\system;C:\WINNT;C:\WINNT\system32;C:\WINNT;C:\WINNT\System32\Wbem;C:\PROGRA~1\COMMON~1\AUTODE~1'
        Environment:  0x10000