使用 TraceProcessor 解析 CLR 事件

Parse CLR Event with TraceProcessor

我已按照 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? 
    }
}

Vance Morrison 的 TraceEvent 提供了一种简单的方法来探索基于清单的事件,其中 Payload 和 PayloadNames 已经根据其清单进行了准备。这不是很有效,但对于许多情况和探索性研究非常有帮助。

(我是 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, there is a property called Fields 中,您应该可以通过整数索引或名称访问事件。