XPerfを使用して、パフォーマンス分析用のアプリケーションをインストルメント化する実験を行っています。私の目標は、C#アプリケーション内の開始/停止イベントをログに記録し、これらのイベント間の特定のカーネルメトリックを分析することです。
TraceListener
アプリケーション内でとを作成し、TraceSource
イベントをソースに記録しています。次に、logmanを使用して2つのセッションを開始します。1つはプロバイダーからのイベントをキャプチャし、もう1つはカーネルイベントをキャプチャします(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");
}