События 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, которая обновляется чаще, чтобы получить новые функции.