3

我正在尝试使用 XPerf 来检测应用程序以进行性能分析。我的目标是在我的 C# 应用程序中记录启动/停止事件并分析这些事件之间的某些内核指标。

我正在我的应用程序中创建一个TraceListenerandTraceSource并将事件记录到源中。然后我使用 logman 启动两个会话:一个从我的提供程序捕获事件,另一个捕获内核事件 ( xperf -on DiagEasy)。在我的会话结束时,我使用 XPerf 将这些文件合并在一起并查看/覆盖图形。所有这些都运作良好。

我的应用程序的事件显示在“通用事件”图表中,但是这些事件没有识别信息(没有名称,没有事件数据),因此很难分辨哪个事件是哪个事件。我知道我的事件数据被捕获,因为当我tracerpt在跟踪输出上运行时它出现在“dumpfile.xml”中。有没有办法将事件名称或事件数据附加到 XPerf 中的“通用事件”?我使用 XPerf 的方法有误吗?

这是一些示例代码,演示了我如何使用 ETW:

static Guid providerId = new Guid("{4A9FD4F3-032B-4733-8455-03BC71ECEFB0}");
static void Main(string[] args)
{
    EventProviderTraceListener listener =
        new EventProviderTraceListener(providerId.ToString());
    TraceSource source = new TraceSource("ProductRepository", SourceLevels.All);
    source.Listeners.Add(listener);

    int id = 12;
    source.TraceData(TraceEventType.Warning, 12, "Some sample data");
    source.TraceEvent(TraceEventType.Start, 1, "TraceEvent.Start({0})", id);
    source.TraceEvent(TraceEventType.Stop, 1, "TraceEvent.Stop({0})", id);
    source.TraceInformation("TraceInformation");
}
4

2 回答 2

1

使用 .net 4.5 中的新 System.Diagnostics.Tracing.EventSource 类。Vance 创建了一个演示如何使用它:

简介教程:在 C# 中记录 ETW 事件:System.Diagnostics.Tracing.EventSource http://blogs.msdn.com/b/vancem/archive/2012/07/09/logging-your-own-etw-events-in- c-system-diagnostics-tracing-eventsource.aspx

于 2012-12-03T14:36:15.897 回答
1

正如 user31273 提到的,XPerf 了解事件有效负载的关键是注册提供者的清单。我没有看到由 magicandre1981 链接的视频,但我敢打赌 Vance 提到了如何注册您的 C# 提供程序。请记住指定正确的操作码(开始/停止)以获得您想要的。

于 2013-01-06T02:04:49.237 回答