이벤트 뷰어
성능 프로파일러에서 앱이 실행 중인 동안 진단 정보를 수집한 다음, 사후 분석과 같이 앱이 중지된 이후에 수집된 정보를 검사할 수 있습니다.
일반 이벤트 뷰어는 모듈 로드, 스레드 시작, 시스템 구성과 같은 이벤트 목록을 통해 앱 활동을 표시합니다. 이 뷰를 사용하면 Visual Studio 프로파일러 내에서 앱 작동을 더 잘 진단할 수 있습니다.
설정
Visual Studio에서 Alt+F2 키를 눌러 성능 프로파일러를 엽니다.
이벤트 뷰어 확인란을 선택합니다.
시작 단추를 선택하여 도구를 실행합니다.
도구가 시작되면 앱에서 프로파일링할 시나리오를 진행합니다. 그런 다음 수집 중지를 선택하거나 앱을 닫아 데이터를 확인합니다.
도구를 보다 효율적으로 만드는 방법에 대한 자세한 내용은 프로파일링 설정 최적화를 참조하세요.
데이터 이해
열 이름 | 설명 |
---|---|
공급자 이름 | 이벤트 소스입니다. |
이벤트 이름 | 해당 공급자가 지정한 이벤트입니다. |
텍스트 | 이벤트의 공급자, 이벤트 이름 및 ID에 대한 설명입니다. |
타임스탬프(ms) | 이벤트가 발생한 시간입니다. |
공급자 GUID | 이벤트 공급자의 ID입니다. |
이벤트 ID | 이벤트의 ID입니다. |
프로세스 ID | 이벤트가 발생한 프로세스입니다(알려진 경우). |
프로세스 이름 | 실행 중인 프로세스의 이름입니다. |
스레드 ID | 이벤트가 발생한 스레드의 ID입니다(알려진 경우). |
열이 기본적으로 누락된 경우 기존 열 머리글 중 하나를 마우스 오른쪽 단추로 클릭하고 추가하려는 열을 선택합니다.
이벤트를 선택하면 추가 속성 창이 표시됩니다. 공용 속성은 이벤트에 대해 표시되는 속성 목록을 표시합니다. 페이로드 속성은 이벤트와 관련된 속성을 표시합니다. 일부 이벤트의 경우 스택을 볼 수도 있습니다.
데이터 구성
텍스트 열을 제외한 모든 열을 정렬할 수 있습니다.
이벤트 뷰어는 한 번에 최대 2만 개의 이벤트를 표시합니다. 관심 이벤트에 초점을 맞추기 위해 이벤트 필터를 선택하여 이벤트 표시를 필터링할 수 있습니다. 또한 각 공급자에 대해 발생한 총 이벤트 수의 백분율을 확인할 수 있으며, 이 정보를 통해 시간이 소요되는 위치를 분석할 수 있습니다. 단일 이벤트 필터를 마우스로 가리키면 다음을 보여 주는 도구 설명이 표시됩니다.
- 이벤트 이름
- 공급자
- GUID
- 총 이벤트에 대한 백분율
- 이벤트 수
공급자 필터에는 각 공급자에 대해 발생한 총 이벤트 대비 백분율이 표시됩니다. 공급자 이름, 총 이벤트 대비 백분율 및 이벤트 수가 포함된 유사한 도구 설명을 보려면 단일 공급자를 마우스로 가리킵니다.
사용자 지정 ETW 이벤트 사용
사용자 지정 ETW 이벤트를 사용하여 코드를 계측하고 이벤트 뷰어에 표시되도록 설정할 수 있습니다. 사용자 지정 이벤트를 사용하도록 설정하려면 다음을 수행합니다.
사용자 지정 이벤트 코드를 빌드합니다.
C++ 사용자 지정 이벤트 코드의 예는 이 섹션의 끝에 제공됩니다.
성능 프로파일러(Alt + F2)를 열고 이벤트 뷰어를 사용하도록 설정한 다음 옆에 있는 설정 아이콘(기어 아이콘)을 선택합니다.
대화 상자에서 추가 공급자 아래 의 첫 번째 행을 사용하도록 설정한 다음 작업 중 하나를 수행합니다.
확인을 선택합니다.
사용자 지정 이벤트는 진단 추적을 수집하고 열 때 이벤트 뷰어에 표시됩니다. 다음 그림에서는 사용자 지정 이벤트만 표시하도록 필터링이 설정된 이벤트 뷰어의 사용자 지정 이벤트를 보여 줍니다.
다음은 C++에 대한 사용자 지정 이벤트 코드의 예입니다.
#include <Windows.h>
#include <evntprov.h>
#include <iostream>
#include <thread>
// This GUID must be regenerated so it is unique for your provider
// {7369B7AC-64EB-4618-B6B6-C8442B12E8F2}
GUID customEventProvider = { 0x7369b7ac, 0x64eb, 0x4618, { 0xb6, 0xb6, 0xc8, 0x44, 0x2b, 0x12, 0xe8, 0xf2 } };
REGHANDLE _customEventProviderRegHandle = 0;
// Id, Version, Channel, Level, OpCode, Task, Keyword
const EVENT_DESCRIPTOR CustomEventDescriptor = { 1, 0, 0, 0, 0, 0, 1 };
int main()
{
// Register the provider
ULONG res = ::EventRegister(&customEventProvider, nullptr, nullptr, &_customEventProviderRegHandle);
if (res != ERROR_SUCCESS)
{
return res;
}
byte data[] = { 0xFF, 0xFF, 0xFF, 0xFF };
EVENT_DATA_DESCRIPTOR eventData[1];
::EventDataDescCreate(&(eventData[0]), &data, sizeof(data));
for (int i = 0; i < 10; ++i)
{
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
::EventWrite(_customEventProviderRegHandle, &CustomEventDescriptor, _countof(eventData), eventData);
std::cout << "Wrote event\n";
}
res = ::EventUnregister(_customEventProviderRegHandle);
if (res != ERROR_SUCCESS)
{
return res;
}
return 0;
}