首页 > 解决方案 > 在 Dotnet 中,如果您只有提供者的 GUID,您如何侦听来自特定 ETW 提供者的事件?

问题描述

我有一个提供者的 GUID,在 Dotnet 中如何监听该提供者生成的所有事件?我有两个外部工具可以让我收听,一个是来自 SDK 的跟踪日志,我运行

tracelog -start <providerName> -b 8192 -seq 2000 -f somefile.bin -guid #00000000,1111,2222,3333,444444555555

此工具仅启用提供程序并返回。然后我运行另一个自定义/私有工具(用 C++ 编写),它收集事件并将它们记录到格式精美的表格中。我正在尝试将所有这些移植到我的 dotnet 应用程序,但我无法收听来自这个给定提供程序的事件。我尝试查看EventProviderTraceListener的 MSDN 文档,那里有一个代码示例,但我不明白这应该如何让我能够收听任意提供者。我还看到了这篇关于 TraceEventSession 的帖子,我曾经尝试过以下代码:

TraceEventSession traceEventSession = new TraceEventSession("myname");
traceEventSession.EnableProvider(new Guid("00000000-1111-2222-3333-444444555555"), TraceEventLevel.Always);
traceEventSession.Source.Dynamic.AddCallbackForProviderEvents(null, @event =>
{
    System.Windows.Forms.MessageBox.Show("Event " + @event.EventName);
});
traceEventSession.Source.Process();

回调被调用,但对于不同的提供者 GUID 和我的提供者不应该发送的事件名称只调用了两次(事件名称是EventTrace/BuildInfoEventTrace/DbgIdRsds)。我还查看了这个文档,它展示了如何实时监听来自内核提供者的事件,看起来我的代码做了同样的事情(尽管对于一个非标准的提供者)。

为什么我得到这两个事件,我怎么能

  1. 启用事件侦听我拥有其 GUID 的提供程序,并且
  2. 仅从该提供者捕获所有事件?(提供者可能会从用户模式和/或内核模式发出事件,我不知道这是否会有所不同)

当我运行单独的工具时,集合工作正常,并且所有事件都被毫无问题地捕获(它们非常频繁地生成,每秒,所以这不是我等待时间不够长的问题)。

标签: c#etw

解决方案


推荐阅读