다음을 통해 공유


스레드 및 프로세스 제어

디버거 엔진의 스레드 및 프로세스에 대한 개요는 스레드 및 프로세스를 참조하세요.

이벤트가 발생하면 이벤트 스레드 및 이벤트 프로세스가 이벤트가 발생한 스레드 및 프로세스(운영 체제 또는 가상)로 설정됩니다. GetEventThreadGetEventProcess를 각각 사용하여 찾을 수 있습니다.

암시적 스레드 및 프로세스

커널 모드 디버깅에서 디버거 엔진은 암시적 프로세스를 사용하여 가상-물리적 주소 변환을 수행할 때 사용할 가상 주소 공간을 결정합니다(예: VirtualToPhysicalReadVirtual 메서드). 이벤트가 발생하면 암시적 프로세스가 현재 프로세스로 설정됩니다.

SetImplicitProcessDataOffset을 사용하여 암시적 프로세스를 변경할 수 있습니다. 암시적 프로세스를 확인하려면 GetImplicitProcessDataOffset을 사용합니다.

참고 라이브 커널 디버깅 세션 중에 중단점을 설정할 때 디버거 엔진은 중단점의 가상 주소를 대상에 전달하고 대상은 중단점을 설정합니다. 이 경우 중단점을 처리할 때 대상의 프로세스 컨텍스트만 사용됩니다. 암시적 프로세스의 값은 관련이 없습니다.

커널 모드 디버깅에서 디버거 엔진은 암시적 스레드 를 사용하여 대상의 레지스터 중 일부를 확인 합니다. 여기에는 프로세서 스택( GetStackOffset 참조), 프레임 오프셋( GetFrameOffset 참조) 및 명령 오프셋( GetInstructionOffset 참조)이 포함됩니다. 이벤트가 발생하면 암시적 스레드가 현재 스레드로 설정됩니다.

SetImplicitThreadDataOffset을 사용하여 암시적 스레드를 변경할 수 있습니다. 암시적 스레드를 확인하려면 GetImplicitThreadDataOffset을 사용합니다.

모든 레지스터가 암시적 스레드에 의해 결정되는 것은 아닙니다. 암시적 스레드가 변경될 때 일부 레지스터는 동일하게 유지됩니다.

경고 암시적 프로세스와 암시적 스레드는 독립적입니다. 암시적 스레드가 암시적 프로세스에 속하지 않으면 암시적 스레드의 사용자 및 세션 상태가 잘못된 가상 주소 공간에 있고 이 정보에 액세스하려고 하면 오류가 발생하거나 잘못된 결과를 제공합니다. 커널 메모리 주소는 모든 가상 주소 공간에서 일정하므로 커널 메모리에 액세스할 때는 이 문제가 발생하지 않습니다. 따라서 커널 메모리에 있는 암시적 스레드에 대한 정보는 암시적 프로세스와 독립적으로 액세스할 수 있습니다.

스레드

엔진 스레드 ID는 디버거 엔진에서 각 운영 체제 스레드와 대상에 대한 각 가상 스레드를 식별하는 데 사용됩니다.

대상이 중지되는 동안 각 스레드에는 대상이 속한 프로세스에 상대적인 인덱스도 있습니다. 모든 프로세스에서 프로세스의 첫 번째 스레드 인덱스는 0이고 마지막 스레드의 인덱스는 프로세스의 스레드 수에서 1을 뺀 값입니다. 현재 프로세스의 스레드 수는 GetNumberThreads를 사용하여 찾을 수 있습니다. GetTotalNumberThreads를 사용하여 현재 대상의 모든 프로세스에 있는 총 스레드 수를 찾을 수 있습니다.

현재 프로세스에서 하나 이상의 스레드에 대한 엔진 스레드 ID 및 시스템 스레드 ID는 GetThreadIdsByIndex를 사용하여 인덱스에서 찾을 수 있습니다.

엔진은 각 스레드에 대한 여러 정보를 유지 관리합니다. 이 정보는 현재 스레드에 대해 쿼리될 수 있으며 스레드에 대한 엔진 스레드 ID를 찾는 데 사용할 수 있습니다.

시스템 스레드 ID(사용자 모드 디버깅만 해당)
현재 스레드의 시스템 스레드 ID는 GetCurrentThreadSystemId를 사용하여 찾을 수 있습니다. 지정된 시스템 스레드 ID의 경우 GetThreadIdBySystemId를 사용하여 해당 엔진 스레드 ID를 찾을 수 있습니다.

스레드 환경 블록(TEB)
현재 스레드에 대한 TEB의 주소는 GetCurrentThreadTeb을 사용하여 찾을 수 있습니다. 지정된 TEB 주소의 경우 GetThreadIdByTeb을 사용하여 해당 엔진 스레드 ID를 찾을 수 있습니다. 커널 모드 디버깅에서 (가상) 스레드의 TEB는 마지막 이벤트가 발생했을 때 해당 프로세서에서 실행 중인 시스템 스레드의 TEB입니다.

데이터 오프셋
사용자 모드 디버깅에서 (시스템) 스레드의 데이터 오프셋은 해당 스레드에 대한 TEB의 위치입니다. 커널 모드에서 (가상) 스레드의 데이터 오프셋을 디버깅하는 것은 마지막 이벤트가 발생했을 때 해당 프로세서에서 실행 중인 시스템 스레드에 대한 KTHREAD 구조입니다. 현재 스레드의 데이터 오프셋은 GetCurrentThreadDataOffset을 사용하여 찾을 수 있습니다. 지정된 데이터 오프셋의 경우 GetThreadIdByDataOffset을 사용하여 해당 엔진 스레드 ID를 찾을 수 있습니다.

시스템 핸들
현재 스레드의 시스템 핸들은 GetCurrentThreadHandle을 사용하여 찾을 수 있습니다. 지정된 시스템 핸들의 경우 GetThreadIdByHandle을 사용하여 해당 엔진 스레드 ID를 찾을 수 있습니다. 커널 모드 디버깅에서는 각 (가상) 프로세스에 대해 인공 핸들이 만들어집니다. 이 핸들은 디버거 엔진 API 쿼리에서만 사용할 수 있습니다.

프로세스

엔진 프로세스 ID는 디버거 엔진에서 각 운영 체제 프로세스와 대상에 대한 각 가상 프로세스를 식별하는 데 사용됩니다.

대상이 중지되는 동안 각 프로세스에는 대상을 기준으로 하는 인덱스가 있습니다. 대상에서 첫 번째 프로세스의 인덱스는 0이고 마지막 프로세스의 인덱스는 대상의 프로세스 수에서 1을 뺀 값입니다. 현재 대상의 프로세스 수는 GetNumberProcesses를 사용하여 찾을 수 있습니다.

현재 대상에 있는 하나 이상의 스레드에 대한 엔진 프로세스 ID 및 시스템 프로세스 ID는 GetProcessIdsByIndex를 사용하여 인덱스에서 찾을 수 있습니다.

엔진은 각 프로세스에 대한 여러 정보를 유지 관리합니다. 이 정보는 현재 프로세스에 대해 쿼리될 수 있으며 프로세스에 대한 엔진 프로세스 ID를 찾는 데 사용할 수 있습니다.

시스템 프로세스 ID(사용자 모드 디버깅만 해당)
현재 프로세스의 시스템 프로세스 ID는 GetCurrentProcessSystemId를 사용하여 찾을 수 있습니다. 지정된 시스템 프로세스 ID의 경우 GetProcessIdBySystemId를 사용하여 해당 엔진 프로세스 ID를 찾을 수 있습니다.

PEB(프로세스 환경 블록)
현재 프로세스에 대한 PEB의 주소는 GetCurrentProcessPeb을 사용하여 찾을 수 있습니다. 지정된 PEB 주소의 경우 GetProcessIdByPeb을 사용하여 해당 엔진 프로세스 ID를 찾을 수 있습니다. 커널 모드 디버깅에서 (가상) 프로세스의 PEB는 마지막 이벤트가 발생했을 때 실행 중인 시스템 프로세스의 PEB입니다.

데이터 오프셋
사용자 모드 디버깅에서 (시스템) 프로세스의 데이터 오프셋은 해당 프로세스의 PEB 위치입니다. 커널 모드 디버깅에서 (가상) 프로세스의 데이터 오프셋은 마지막 이벤트가 발생했을 때 실행 중이던 시스템 프로세스에 대한 KPROCESS 구조입니다. 현재 프로세스의 데이터 오프셋은 GetCurrentProcessDataOffset을 사용하여 찾을 수 있습니다. 지정된 데이터 오프셋의 경우 GetProcessIdByDataOffset을 사용하여 해당 엔진 프로세스 ID를 찾을 수 있습니다.

시스템 핸들
현재 프로세스의 시스템 핸들은 GetCurrentProcessHandle을 사용하여 찾을 수 있습니다. 지정된 시스템 핸들의 경우 GetProcessIdByHandle을 사용하여 해당 엔진 프로세스 ID를 찾을 수 있습니다. 커널 모드 디버깅에서는 (가상) 프로세스에 대한 인공 핸들이 만들어집니다. 이 핸들은 디버거 엔진 쿼리에만 사용할 수 있습니다.

이벤트

라이브 사용자 모드 디버깅에서는 스레드가 대상에서 생성되거나 종료될 때마다 create-thread 및 exit-thread 디버깅 이벤트가 생성됩니다. 이러한 이벤트는 IDebugEventCallbacks::CreateThreadIDebugEventCallbacks::ExitThread 콜백 메서드를 호출합니다.

라이브 사용자 모드 디버깅에서는 프로세스가 대상에서 생성되거나 종료될 때마다 create-process 및 exit-process 디버깅 이벤트가 생성됩니다. 이러한 이벤트는 IDebugEventCallbacks::CreateProcessIDebugEventCallbacks::ExitProcess 콜백 메서드를 호출합니다.

이벤트에 대한 자세한 내용은 이벤트 모니터링을 참조하세요.

추가 정보

TEB, KTHREAD, PEB 및 KPROCESS 구조를 포함한 스레드 및 프로세스에 대한 자세한 내용은 David Solomon 및 Mark Russinovich의 Microsoft Windows 내부 를 참조하세요.