我可以在 C# 控制台应用程序中使用EventSource成功生成 ETW 事件;但是,如果我将事件存储在 ETL 文件中并使用 Windows 性能分析器,则与有效负载值、事件名称和提供程序名称相对应的列显示为空。
问题
EventSource 是否有任何额外的配置允许填充 WPA 中的列?
笔记:
- 这里发布了另一个问题:“您如何查看 EventSource 使用 Windows 性能分析器创建的 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 创建跟踪 MySession -p {56ff7ff6-0418-4501-945f-c12737bc1c70} -o MySession.etl
- logman 启动 MySession
- 运行 C# 控制台应用程序
- logman 停止 MySession
- 用WPA打开ETL,你会从代码中看到三个事件对应的三行,但是这些行是空的
- 使用 PerfView 打开 ETL,您将看到原始数据存在(您可以在选择事件时按 ALT+D 将事件转储到 PerfView 中的控制台)