Разобрать событие CLR с TraceProcessor - PullRequest
0 голосов
/ 19 апреля 2020

Я следовал инструкциям на https://docs.microsoft.com/en-us/windows/apps/trace-processing/extensibility, чтобы получить в свои руки. NET События времени выполнения. Когда я получаю экземпляр EventContext с неразобранными данными, у меня нет удобного способа дальнейшего анализа?

В идеале должен быть генератор парсера для событий, основанных на манифесте, как в случае с TraceEvent. Что-то вроде

TraceProcessorGen -generateEvents c:\Windows\Microsoft.NET\Framework\v4.0.30319\CLR-ETW.man

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

class ClrDataSource : IFilteredEventConsumer
{
    public IReadOnlyList<Guid> ProviderIds { get; } = new Guid[] { new Guid("e13c0d23-ccbc-4e12-931b-d9cc2eee27e4") };

    public int Count { get; private set; }

    public void Process(EventContext eventContext)
    {
        ReadOnlySpan<byte> data = eventContext.Event.Data;
        // What do do next? 
    }
}

TraceEvent от Вэнса Моррисона имеет простой способ исследовать события, основанные на манифесте, где Payload и PayloadNames уже подготовлены на основе их манифеста. Это не очень эффективно, но для многих случаев и исследовательских исследований очень полезно.

1 Ответ

2 голосов
/ 20 апреля 2020

(я являюсь разработчиком в Microsoft, работающим над проектом TraceProcessor.)

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

Однако проанализированные события для этого провайдера должны быть доступны в IGenericEventDataSource следующим образом:

using (ITraceProcessor trace = TraceProcessor.Create(tracePath))
{
    Guid[] providerIds = new[] { Guid.Parse("e13c0d23-ccbc-4e12-931b-d9cc2eee27e4") };

    IPendingResult<IGenericEventDataSource> pendingEventsData = trace.UseGenericEvents(providerIds);

    trace.Process();

    IGenericEventDataSource eventData = pendingEventsData.Result;

    foreach (IGenericEvent genericEvent in eventData.Events)
    {
        // Process event here
    }
}

Внутри каждого IGenericEvent , есть свойство под названием Fields , которое должно позволять вам получать доступ к событиям либо по целочисленному индексу, либо по имени.

...