Поделиться через


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

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

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

Настройка

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

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

    Установленный флажок

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

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

    Окно с параметром Остановить сбор

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

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

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

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

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

Добавление столбцов в средство просмотра событий

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

Средство просмотра событий, где отображаются стеки

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

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

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

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

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

Фильтр событий обозревателя событий

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

Фильтр поставщика средства просмотра событий

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

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

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

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

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

    Снимок экрана: значок параметров просмотра событий.

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

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

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

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

      Снимок экрана: параметры просмотра событий.

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

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

    Снимок экрана: средство просмотра событий с пользовательскими событиями.

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