디버거 엔진의 스레드 및 프로세스에 대한 개요는 스레드 및 프로세스를 참조하세요.
이벤트가 발생하면 이벤트 스레드 및 이벤트 프로세스가 이벤트가 발생한 스레드 및 프로세스(운영 체제 또는 가상)로 설정됩니다. GetEventThread 및 GetEventProcess를 사용하여 각각 찾을 수 있습니다.
암시적 스레드 및 프로세스
커널 모드 디버깅에서 디버거 엔진은 암시적 프로세스를 사용하여 가상 주소 변환을 수행할 때 사용할 가상 주소 공간을 결정합니다(예: VirtualToPhysical 및 ReadVirtual 메서드). 이벤트가 발생하면 암시적 프로세스가 현재 프로세스로 설정됩니다.
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::CreateThread 및 IDebugEventCallbacks::ExitThread 콜백 메서드를 호출합니다.
라이브 사용자 모드 디버깅에서는 프로세스가 대상에서 생성되거나 종료될 때마다 만들기 프로세스 및 종료 프로세스 디버깅 이벤트가 생성됩니다. 이러한 이벤트는 IDebugEventCallbacks::CreateProcess 및 IDebugEventCallbacks::ExitProcess 콜백 메서드를 호출합니다.
이벤트에 대한 자세한 내용은 이벤트 모니터링을 참조하세요.
추가 정보
TEB, KTHREAD, PEB 및 KPROCESS 구조를 비롯한 스레드 및 프로세스에 대한 자세한 내용은 David Solomon 및 Mark Russinovich의 Microsoft Windows 내부 를 참조하세요.