事件源事件在 Windows 性能分析器中显示为空

本文关键字:显示 分析器 性能 事件 Windows 事件源 | 更新日期: 2023-09-27 18:33:12

我可以在 C# 控制台应用中使用 EventSource 成功生成 ETW 事件;但是,如果我将事件存储在 ETL 文件中并使用 Windows 性能分析器,则与有效负载值、事件名称和提供程序名称对应的列显示为空。

问题

事件源是否有任何额外的配置可以允许填充 WPA 中的列?

笔记:

  • 这里发布了另一个问题:"您如何使用 Windows 性能分析器查看 EventSource 创建的 ETW 事件?",我相信这个问题不是我的重复,因为我可以看到表示 WPA 中事件的行,只是事件是空的。
  • 如果我使用 PerView.exe 分析 ETL,我可以看到事件的原始数据存在
  • 如果我使用手头的库从C++创建事件,则生成的 ETW 事件将在 WPA 中正确显示
  • 在WPA中拥有空列不是一个大问题,我真正的问题是用C++编写的第二个应用程序期望事件具有有效负载和事件名称,但无法识别事件。我相信WPA中的空列和C++应用程序中无法识别事件是两个相关的症状,并且鉴于WPA具有空列是任何人都可以通过简单地运行我在下面描述的步骤来重现的,这就是为什么我在介绍我的问题时提到这个问题作为主要症状。

最少的代码:

using System.Diagnostics.Tracing;
namespace EtwConsoleApp {
    class Program {
        static void Main(string[] args) {
            MyEventSource.Instance.MyEvent("x");
            MyEventSource.Instance.MyEvent("y");
            MyEventSource.Instance.MyEvent("z");
        }
    }
    [EventSource(Guid = "56ff7ff6-0418-4501-945f-c12737bc1c70")]
    sealed class MyEventSource : EventSource {
        [Event(1, Level = EventLevel.Verbose, Opcode = EventOpcode.Info)]
        public void MyEvent(string value) {
            this.WriteEvent(1, value);
        }
        public static MyEventSource Instance = new MyEventSource();
    }
}

请参阅 WPA 中的空行:

  • 打开提升的 CMD
  • logman create trace MySession -p {56ff7ff6-0418-4501-945f-c12737bc1c70} -o MySession.etl
  • logman 启动我的会话
  • 运行 C# 控制台应用程序
  • logman stop mySession
  • 使用 WPA 打开 ETL,您将看到代码中对应于三个事件的三行,但是这些行是空的
  • 使用 PerfView
  • 打开 ETL,您将看到原始数据存在(您可以在选择事件时按 Alt+D 将事件转储到 PerfView 中的控制台(

事件源事件在 Windows 性能分析器中显示为空

.NET 4.5 中的 System.Diagnostics.Tracing.EventSource 不会生成由 WPA 正确可视化的事件。

解决方案是使用:Microsoft.诊断.跟踪.事件源

另一种解决方案是使用:System.Diagnostics.Tracing.EventSource from .NET 4.6(在我的情况下是不可能的(

System.Diagnostics.Tracing显示您使用 .NET Framework 4.5 的收件箱版本。尝试Nuget版本Microsoft.Diagnostics.Tracing.EventSource,该版本会更频繁地更新以获取新功能。