2016-05-13 19 views
2

C++とC#で記述されたマニフェストベースのETWプロバイダがあります。どちらのプロバイダも同じマニフェストを使用します(C#コードのMicrosoft.Diagnostics.Tracing.TraceEventパッケージによって生成されます)。チャネルはデバッグです。 イベントのパブリッシングは両方のプロバイダで成功(戻り値は0)で、perfviewで表示されます。ETW C++プロバイダとC#プロバイダ

マニフェストがインストールされていない場合、C++プロバイダのイベントはプロバイダのGUID、イベントIDなどと共にperfviewに表示されます。プロバイダ名、イベント名などの「文字列」プロパティはありません。 しかし、C#プロバイダのイベントにはこれらのプロパティがあります。 なぜC#プロバイダがこれを行うことができますか? EventSource.csにはSendManifestメソッドがあり、ManifestDataイベントはC#プロバイダーを使用する場合にのみ追加されます。これは理由ですか?もしそうなら、C++プロバイダはこの動作を達成できますか?

私はwevtutil.exeまたはeventregister.exeでマニフェストをインストールする方法を知っています。いくつかの調査の後、私はC++で「自己記述型」イベントを実装する必要があることを発見しました。

答えて

0

のWindows 10 SDKは全くマニフェストを必要としない新しいETWシステムのサポートが含まれて参照してください。これらのイベントを生成するには、TraceLoggingProvider.hヘッダーを使用します。この新しいシステムは、eventSource.Writeメソッドを使用する場合、またはマニフェストフリーフラグを設定した場合は、EventSourceの.NET 4.6以降でもサポートされています。 (新しい機能を使用したいが、あなたのプログラムのために.NET 4.6を前提条件にしたくない場合は、EventSource NuGetパッケージもある)

この技術は新しいsdkを必要とし、新しいログファイル形式を決定するための新しいデコーダツールが必要です。このテクノロジは、Vista以降で動作するプログラムで動作します。つまり、Windows 10 SDKを使用して新しいTraceLoggingProvider.hヘッダーを取得する必要がありますが、WINVERマクロをOSに適した値に設定する限り、結果のプログラムはVista以降で正常に実行されます目標にしたい

主な利点は、マニフェストが必要ないことです。主な欠点は、ログファイルが少し大きくなることです(イベントごとにデコード方法に関する情報が含まれている必要があるため)。

また、マニフェストベースのETWを使用する場合は、もう1つの答えは正解で有効です。マニフェストベースのイベントの正式にサポートされる唯一のシステムは、マニフェストを登録することです。 EventSourceが使用するシステム(マニフェストをETWにコピーする)は十分に文書化されておらず、すべてのETWデコードツールでサポートされているわけではありません。あなた自身。ログファイルの収集とデコードに興味がある場合は、デコードを行うマシンにマニフェストを登録する必要があります(マニフェストはマージとデコードにのみ使用されます。ログがキャプチャされています)。

+0

遅く返事を申し訳ありません。 Win10 SDKの製品がVistaまたはそれ以降で動作することはわかりませんが...これは「推奨」の方法かもしれません。私は後でそれを試してみる:)ありがとう! – user1208

0

私が知る限り、TraceEventは、ETLストリームのランダウン中にマニフェストを発行し、その後WPAでデコードすることができます。その後、WPAは文字列化された名前を表示できます。 C#プロバイダとC++プロバイダの両方を実行させる場合は、名前の付いた1つのETWプロバイダが表示されます。個人的に私はC#ETWプロバイダからマニフェストを作成し、それをwevtutilを使用してシステムに登録することでその問題を解決しました。その後、私はいつも名前を取得しますが、私はそれを行うための管理者権限が必要です。

http://etwcontroler.codeplex.com/SourceControl/latest#ETWControler/ETW/HookEvents.cs

+0

はい、wevtutil imコマンドでマニフェストをインストールすると、C++プロバイダのイベントは文字列化されたプロパティで表示されます。ですから、C++プロバイダのイベントを名前で表示したい場合は、マニフェストをインストールする必要がありますか?あるいは、C#プロバイダが手動でETWにマニフェストを公開すると、名前とともに表示されますか?もしそうなら、これに関するドキュメントはありますか?(イベントID、レベル、キーワードなど)おそらく、C#プロバイダのManifestDataイベントをコピーして公開することはできますが、正しい方法を知りたいことがあります。おかげさまで – user1208

+0

プロジェクトへのリンクは、C#プロバイダからマニフェストを作成してシステムに登録する方法を正確に示しています。 –

関連する問題