我正在尝试使用XPerf来对一个应用程序进行性能分析。我的目标是记录C#应用程序内的开始/结束事件,并分析这些事件之间的某些内核指标。
我在应用程序内创建了一个TraceListener和TraceSource,并将事件记录到源中。然后我使用logman启动了两个会话:一个用于捕获来自我的提供者的事件,另一个用于捕获内核事件(xperf -on DiagEasy)。在会话结束时,我使用XPerf将这些文件合并在一起并查看/叠加图形。所有这些都很好地运作。
我的应用程序事件出现在“通用事件”图表中,但事件没有任何识别信息(没有名称,没有事件数据),因此很难确定哪个事件是哪个。我知道我的事件数据已被捕获,因为当我在跟踪输出上运行tracerpt时,它会出现在“dumpfile.xml”中。有没有办法将事件名称或事件数据附加到XPerf的“通用事件”中?我的XPerf使用方法是否错误?
下面是一些演示我如何使用ETW的示例代码:
我在应用程序内创建了一个TraceListener和TraceSource,并将事件记录到源中。然后我使用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");
}