Средство просмотра событий

В профилировщике производительности вы можете собирать диагностические сведения во время работы приложения, а затем проверять собранные сведения после остановки приложения, как после завершения анализа.

Средство просмотра обычных событий позволяет просматривать действия приложения с помощью списка таких событий, как загрузка модуля, запуск потока и конфигурация системы. Это представление поможет вам эффективнее диагностировать работу приложения в профилировщике Visual Studio.

Настройка

  1. Откройте профилировщик производительности (ALT+F2) в Visual Studio.

  2. Установите флажок Средство просмотра событий.

    The Events Viewer check box selected

  3. Нажмите кнопку Пуск, чтобы запустить средство.

  4. После его запуска просмотрите сценарий, который необходимо профилировать в приложении. Затем выберите Остановить сбор или закройте приложение, чтобы просмотреть данные.

    A window showing Stop collection

Дополнительные сведения о том, как сделать средство более эффективным, см. в статье Оптимизация параметров профилирования.

Расшифровка данных

An event viewer trace

Имя столбца Description
Имя поставщика Источник события
Имя события Событие, указанное поставщиком
Text Описание поставщика, имени и идентификатора события
Метка времени (мс) Время, когда произошло событие
GUID поставщика Идентификатор поставщика событий
ИД события Идентификатор события
Идентификатор процесса Процесс, в котором произошло событие (если известно)
Имя процесса Имя процесса, если он активно выполняется
Идентификатор потока Идентификатор потока, в котором произошло событие (если известно)

Если по умолчанию отсутствует какой-либо столбец, щелкните правой кнопкой мыши один из существующих заголовков столбцов и выберите тот, который необходимо добавить.

Adding columns to the event viewer

При выборе события отображается окно Дополнительные свойства. В разделе Общие свойства содержится список свойств, которые будут отображаться для любого события. В разделе Свойства полезных данных содержатся свойства, относящиеся к событию. Для некоторых событий можно также просмотреть раздел Стеки.

The event viewer showing stacks

Организация данных

Все столбцы, кроме столбца Текст, можно сортировать.

The event viewer trace

В средстве просмотра событий отображается до 20 000 событий за раз. Чтобы сосредоточиться на интересующих событиях, можно отфильтровать отображение событий, выбрав фильтр событий. Вы также можете увидеть, какой процент от общего количества событий произошло для каждого поставщика, и эта информация дает вам разбивку о том, где тратится ваше время. Наведите указатель мыши на один фильтр событий, чтобы увидеть подсказку, отображающую:

  • Имя события
  • Provider
  • GUID
  • Процент от общих событий.
  • Число событий.

The event viewer event filter

Фильтр поставщика показывает, какой процент от общего числа событий произошел для каждого поставщика. Наведите указатель мыши на одного поставщика, чтобы увидеть похожую подсказку с именем поставщика, процентом от общего числа событий и числом событий.

The event viewer provider filter

Включение пользовательских событий ETW

Вы можете инструментировать код с пользовательскими событиями ETW и включить их в средстве просмотра событий. Чтобы включить пользовательские события, выполните приведенные действия.

  1. Создайте пользовательский код события.

    Пример пользовательского кода события C++ представлен в конце этого раздела.

  2. Откройте профилировщик производительности (ALT+F2), включите средство просмотра событий, а затем щелкните значок Параметры (значок шестеренки) рядом с ним.

    Screenshot of the events viewer settings icon.

  3. В диалоговом окне включите первую строку в разделе "Дополнительные поставщики", а затем выполните одно из следующих действий:

    • Для собственного пользовательского кода события задайте GUID поставщика на основе GUID для пользовательского кода события и оставьте значение имени поставщика пустым или используйте его значение по умолчанию.

    • Для пользовательского кода события C# задайте то же значение имени поставщика, которое использовалось при объявлении кода события. Это имя преобразуется в GUID в фоновом режиме, поэтому оставьте идентификатор GUID поставщика пустым.

      Для собственного настраиваемого события строка должна выглядеть примерно так, как показано на следующем рисунке.

      Screenshot of the events viewer settings.

  4. Нажмите ОК.

    Настраиваемое событие отображается в средстве просмотра событий при сборе трассировки диагностика и его открытии. На следующем рисунке показаны пользовательские события в средстве просмотра событий с параметром фильтрации, чтобы отобразить только настраиваемое событие.

    Screenshot of the events viewer showing custom events.

Ниже приведен пример пользовательского кода события для 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;
}