c# - 在 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/BuildInfo和EventTrace/DbgIdRsds)。我还查看了这个文档,它展示了如何实时监听来自内核提供者的事件,看起来我的代码做了同样的事情(尽管对于一个非标准的提供者)。
为什么我得到这两个事件,我怎么能
- 启用事件侦听我拥有其 GUID 的提供程序,并且
- 仅从该提供者捕获所有事件?(提供者可能会从用户模式和/或内核模式发出事件,我不知道这是否会有所不同)
当我运行单独的工具时,集合工作正常,并且所有事件都被毫无问题地捕获(它们非常频繁地生成,每秒,所以这不是我等待时间不够长的问题)。
解决方案
推荐阅读
- delphi - 从 DELPHI 代码执行应用程序,FMX 框架问题
- vba - 将项目符号列表应用于动态创建的段落
- ansible - 来自 JSON 格式的 Ansible jinja2 模板作为额外变量提供
- google-sheets - 每月平均体重 - 图表 - Google 表格
- javascript - 在应成为超链接的 Three.js 中加载多个 gltf 文件
- javascript - 从文本字段附加值时,HTML 视频播放器不起作用
- android - 获取 Mesibo 连接状态 6 和 7
- c# - 如何为嵌套对象创建构建器
- graph - 如何存储和查询集合依赖问题
- javascript - 如何使用 useState React 钩子在子组件中更改父组件的值