Skip to content

Latest commit

 

History

History
81 lines (51 loc) · 11.4 KB

ETW.md

File metadata and controls

81 lines (51 loc) · 11.4 KB

윈도우 이벤트 추적

윈도우 이벤트 추적(Event Tracing for Windows; ETW)은 윈도우 OS커널 또는 프로그램이 수행한 작업들을 살펴볼 수 있도록 구현된 기술이다. 컴파일되어 운영 중인 환경에서 프로그램 동작을 진단할 수 있기 때문에 개발 및 디버깅 등의 목적으로 활용된다.

  • 추적 이벤트(trace event): 커널 또는 프로그램이 수행한 개별 동작
  • 추적 메시지(trace message): 세션이 구축되었을 때, 발생한 이벤트에 대응하여 보고되는 알림

프로그램을 제어하려는 목적으로 ETW의 이벤트를 활용하면 절대 안된다. 입출력 오류, 메모리 부족 등의 경우에서 이벤트가 소실될 수 있기 때문이다.

아래는 ETW의 구성 및 역할, 그리고 상호관계를 소개하여 전반적인 프레임워크 원리를 설명한다.

추적 제공자

추적 제공자(trace provider)는 어플리케이션 및 드라이버의 코드로 내재되어 ETW의 추적 메시지 (또는 이벤트)를 생성하는 구성요소이다. 각 추적 제공자마다 32바이트의 control GUID와 명칭이 함께 정의된다. 해당 GUID로부터 활성화 할 추적 제공자를 선택하여 메시지 (또는 이벤트)를 생성하도록 한다.

추적 제공자 목록은 세션을 구축하는 추적 제어자 역할의 프로그램 또는 도구를 통해 확인할 수 있다.

추적 제공자의 control GUID 및 명칭 예시
GUID제공자
{A0E9B465-B939-57D7-B27D-95D8E925FF57}Application Error
{A68CA8B7-004F-D7B6-A698-07E2DE0F1F5D}Microsoft-Windows-Kernel-General
{0EAD09BD-2157-539A-8D6D-C87F95B64D70}Windows Error Reporting

추적 소비자

추적 소비자(trace consumer)는 제공자로부터 수신한 추적 메시지를 사용자가 읽을 수 있는 서식으로 변환하는 어플리케이션 및 도구를 가리킨다. 다음은 추적 소비자 역할을 수행할 수 있는 프로그램 및 도구를 소개한다.

추적 제어자

추적 제어자(trace controller)는 세션을 관리하는 프로그램 및 도구를 가리킨다: 추적 제공자 활성화, 세션을 구성하고 추적 시작 및 중단, 그리고 세션을 탐색하고 속성을 업데이트 할 수 있다. 다음은 추적 제어자 역할을 수행할 수 있는 프로그램 및 도구를 소개한다.

추적 세션

추적 세션(trace session)은 추적 제공자가 메시지를 생성하는 기간을 가리킨다. 그 동안 시스템은 추적 로그 또는 소비자로 전달("flushed")될 때까지 추적 메시지를 저장할 버퍼 집합들을 운영한다.

윈도우 10, 버전 1709 이전에는 동시에 운영할 수 있는 추적 세션이 최대 64개로 고정되었다. 이후에 HKLM\SYSTEM\CurrentControlSet\Control\WMI 레지스트리 키의 EtwMaxLoggers란 REG_DWORD 값을 통해 32 - 256 범위 내로 변경할 수 있다. 만일 운영 중인 세션이 한계치에 도달하면 (NT 커널 로거전역 로거 추적 세션 포함) ERROR_NO_SYSTEM_RESOURCES 오류가 반환된다.

다음은 추적 세션의 기초적인 세 가지 유형을 소개한다:

  • 추적 로그 세션(trace log sessions)

    추적 세션의 기본 표준 유형으로, 버퍼에 담긴 메시지가 이진 형식으로 로그 파일로 작성된다.

  • 실시간 추적 세션(real-time trace sessions)

    추적 세션의 버퍼에 담긴 메시지는 로그 파일로 저장되지 않은 대신 (혹은 로그 파일로 저장되는 동시에) 곧바로 TraceView 또는 Tracefmt 등의 추적 소비자로 직접 전달된다.

  • 버퍼된 추적 세션(buffered trace sessions)

    추적 세션이 유지되는 동안 메시지는 버퍼에만 남아 있으며 외부(즉, 로그 파일 및 추적 소비자)로 전달되지 않는다. 원형 버퍼 특성을 지니기 때문에, 용량이 찼다면 최신 메시지는 가장 오래된 메시지를 덮어씌우는 방식으로 관리된다. 때문에 오버헤드가 가장 작은 추적 세션 유형이다. WinDbg 등의 디버거를 통해 당장 버퍼에 담긴 메시지를 보거나(!wmitrace 참고) 저장할 수 있다.

NT 커널 로거 추적 세션

NT 커널 로거 추적 세션(NT Kernel Logger trace session)은 윈도우 NT 커널의 이벤트를 추적하는 예약된, 즉 윈도우에 이미 내장되어 별도로 관리되는 세션이다. 커널 모드 드라이버나 사용자 모드의 어플리케이션의 추적 제공자가 해당 세션으로 로깅을 불허하고 오로지 커널의 추적 제공자들만 허용한다 (반면, NT 커널의 추적 제공자는 타 추적 세션에 로깅될 수 없다). NT 커널 로거 추적 세션에 한하여 최대 여덟 개까지 동시에 운영할 수 있다.

프로세스, 디스크파일 입출력 등의 커널 제공자를 EVENT_TRACE_PROPERTIES 구조체의 EnableFlags 맴버에 플래그를 추가하여 제어할 수 있다.

전역 로거 추적 세션

전역 로거 추적 세션(Global Logger trace session)은 시스템이 완전히 동작하기 전의 부팅 과정 동안에 이벤트를 기록하는 예약된 세션이다. 전역 로거 세션은 오로지 로그 파일로만 메시지를 저장, 즉 실시간 및 버퍼된 추적 세션을 지원하지 않는다. 커널 모드 드라이버나 사용자 모드의 어플리케이션의 추적 제공자가 해당 세션으로 로깅하는 걸 허용한다. 시스템은 오로지 한 개의 전역 로거 추적 세션만 운영할 수 있다.

  • 세션 명칭: GlobalLogger
  • 세션 GUID: GlobalLoggerGuid 상수

HKLM\SYSTEM\CurrentControlSet\Control\WMI\GlobalLogger에 세션 GUID를 이름으로 한 하위 레지스트리 키를 생성하여 세션 정보를 값으로 저장하는 방식이다. 시스템 부팅마다 운영되므로, 이를 방지하려면 Start 값을 0으로 설정하거나 전부 삭제해야 한다.

개인 추적 세션

개인 추적 세션(private trace session), 일명 사용자 모드 추적 세션(user-mode trace session)은 사용자 모드프로세스에서 운영되는 추적 세션이며, 오로지 동일 프로세스의 추적 제공자가 생성한 메시지만 로깅한다 (위에서 소개한 일반 추적 세션들은 모두 커널 모드에서 운영된다). 비록 최대 64개의 동시 운영 가능한 세션 개수에 해당하지 않으나, 각 프로세스마다 운영할 수 있는 개인 추적 세션은 한 개로 제한된다.

다음은 개인 추적 세션의 몇 가지 특징을 소개한다:

  • 실시간 추적 세션으로 수행될 수 없으며, 메시지는 반드시 로그 파일로 작성되어야 한다.
  • 만일 버퍼된 추적 세션으로 수행된다면 버퍼의 메모리는 페이징될 수 있으며, 버퍼 메모리의 페이징 및 비페이징 여부 선택은 불가하다.
  • !wmitrace 확장도구는 개인 추적 세션을 지원하지 않으므로 WinDbg와 같은 디버거로 메시지를 볼 수 없다.

이벤트 추적 로그

이벤트 추적 로그(event trace log; ETL)는 하나 이상의 ETW 세션에서 생성된 메시지가 압축되어 저장된 .etl 확장자 파일이다. 텍스트 로그에 비해 용량이 작으며, 프로그램에 의해 간편하게 분석될 수 있는 장점을 지닌다. 하지만 직접 분석하려면 텍스트 형식으로 변환되어야 하며, 이때 해당 ETL 로그를 생성한 윈도우 구성요소의 심볼 파일이 필요하다.

ETL을 분석할 수 있는 대표적인 도구 중 하나가 바로 Windows Performance Analyzer이다.