События EventSource отображаются пустыми в анализаторе производительности Windows

Я могу успешно генерировать события ETW с помощью EventSource в консольном приложении C#; однако если я сохраню события в файле ETL и использую анализатор производительности Windows, столбцы, соответствующие значениям полезной нагрузки, имени события и имени поставщика, будут пустыми.

ВОПРОС

Существуют ли какие-либо дополнительные конфигурации для EventSource, которые позволили бы заполнить столбцы в WPA?

Заметки:

  • Здесь есть еще один вопрос: "Как вы смотрите на события ETW, созданные EventSource с помощью Windows Performance Analyzer?", Я считаю, что этот вопрос не является моим дубликатом, так как я вижу строки, представляющие события в WPA, это просто что события пусты.
  • Если я проанализирую ETL с помощью PerView.exe, я вижу, что присутствуют необработанные данные для события
  • Если я создаю событие из C++ с использованием имеющейся у меня библиотеки, итоговые события ETW правильно отображаются в WPA
  • Наличие пустых столбцов в WPA не является большой проблемой, моя настоящая проблема заключается в том, что второе приложение, написанное на C++, ожидает, что события будут иметь полезную нагрузку, а имя события не сможет идентифицировать события. Я считаю, что пустые столбцы в WPA и приложении C++, не предназначенные для идентификации событий, являются двумя связанными признаками, и, учитывая, что WPA с пустыми столбцами - это то, что любой может воспроизвести, просто выполнив шаги, которые я описал ниже, поэтому я упомянул этот вопрос как основной симптом во введении моего вопроса.

Минимальный код:

using System.Diagnostics.Tracing;
namespace EtwConsoleApp {
    class Program {
        static void Main(string[] args) {
            MyEventSource.Instance.MyEvent("x");
            MyEventSource.Instance.MyEvent("y");
            MyEventSource.Instance.MyEvent("z");
        }
    }

    [EventSource(Guid = "56ff7ff6-0418-4501-945f-c12737bc1c70")]
    sealed class MyEventSource : EventSource {
        [Event(1, Level = EventLevel.Verbose, Opcode = EventOpcode.Info)]
        public void MyEvent(string value) {
            this.WriteEvent(1, value);
        }

        public static MyEventSource Instance = new MyEventSource();
    }
}

Смотрите пустые строки в WPA:

  • Откройте повышенный CMD
  • logman создать трассировку MySession -p {56ff7ff6-0418-4501-945f-c12737bc1c70} -o MySession.etl
  • Logman начать MySession
  • Запустите консольное приложение C#
  • Логман остановить MySession
  • Откройте ETL с WPA, вы увидите три строки, соответствующие трем событиям из кода, однако строки пусты
  • Откройте ETL с помощью PerfView, вы увидите, что необработанные данные присутствуют (вы можете вывести событие на консоль в PerfView, нажав ALT+D, когда событие выбрано)

2 ответа

System.Diagnostics.Tracing.EventSource из.NET 4.5 не создает события, которые правильно визуализируются WPA.

Решение было использовать: Microsoft.Diagnostics.Tracing.EventSource

Другое решение заключается в использовании: System.Diagnostics.Tracing.EventSource из.NET 4.6 (что в моем случае было невозможно)

System.Diagnostics.Tracing показывает, что вы используете входящую версию.net Framework 4.5. Попробуйте версию Nuget https://www.nuget.org/packages/Microsoft.Diagnostics.Tracing.EventSource, которая обновляется чаще, чтобы получить новые функции.

Другие вопросы по тегам