Я экспериментирую с использованием XPerf для инструментария приложения для анализа производительности. Моя цель — регистрировать события запуска/остановки в моем приложении C# и анализировать определенные метрики ядра между этими событиями.
Я создаю TraceListener
и TraceSource
в своем приложении и регистрирую события в источнике. Затем я использую logman для запуска двух сеансов: один для захвата событий от моего провайдера, а другой для захвата событий ядра (xperf -on DiagEasy
). В конце сеанса я использую XPerf для объединения этих файлов и просмотра/наложения графиков. Все это хорошо работает.
События моего приложения отображаются на диаграмме «Общие события», однако события не имеют идентифицирующей информации (без имени, без данных о событии), поэтому трудно определить, какое событие является каким. Я знаю, что данные о моем событии захвачены, потому что они появляются в файле dumpfile.xml, когда я запускаю tracerpt
в выводе трассировки. Есть ли способ прикрепить имена событий или данные о событиях к «Общим событиям» в XPerf? Является ли мой подход к использованию XPerf неправильным?
Вот пример кода, демонстрирующий, как я использую ETW:
static Guid providerId = new Guid("{4A9FD4F3-032B-4733-8455-03BC71ECEFB0}");
static void Main(string[] args)
{
EventProviderTraceListener listener =
new EventProviderTraceListener(providerId.ToString());
TraceSource source = new TraceSource("ProductRepository", SourceLevels.All);
source.Listeners.Add(listener);
int id = 12;
source.TraceData(TraceEventType.Warning, 12, "Some sample data");
source.TraceEvent(TraceEventType.Start, 1, "TraceEvent.Start({0})", id);
source.TraceEvent(TraceEventType.Stop, 1, "TraceEvent.Stop({0})", id);
source.TraceInformation("TraceInformation");
}