TRACELOGGING_DEFINE_PROVIDER マクロ (traceloggingprovider.h)
トレース ログ プロバイダーのハンドルを定義します。
構文
void TRACELOGGING_DEFINE_PROVIDER(
[in] handleVariable,
[in] providerName,
[in] providerId,
[in, optional] __VA_ARGS__
);
パラメーター
[in] handleVariable
グローバル変数のコンポーネントの名前付け規則 (例: または g_hMyProvider
) を使用して、プロバイダーのハンドルに使用する名前。 MyComponentLog
[in] providerName
トレース ログ プロバイダーの名前を持つ文字列リテラル。 この名前は、他のコンポーネントのプロバイダーと競合しないように、organizationとコンポーネントに固有である必要があります。 この名前の文字列は、プロバイダーによって生成された各 ETW イベントに含まれるので、比較的短い名前を使用してください。 たとえば、 や "MyCompany.MyOrganization.MyComponent"
のような"MyCompany.MyComponent"
名前を使用できます。
これは文字列リテラルである必要があります。 変数は使用しないでください。
[in] providerId
かっこ内の 11 個の整数のコンマ区切りリストとして指定された、プロバイダーの ETW コントロール GUID。 たとえば、GUID {ce5fa4ea-ab00-5402-8b76-9f76ac858fb5}
は として (0xce5fa4ea,0xab00,0x5402,0x8b,0x76,0x9f,0x76,0xac,0x85,0x8f,0xb5)
表されます。
プロバイダー ID には一意の GUID を使用できますが、ETW 名ハッシュ アルゴリズムを使用してプロバイダー名から生成された GUID を使用することをお勧めします。 プロバイダー ID の生成については、以下を参照してください。
[in, optional] __VA_ARGS__
プロバイダーの省略可能なパラメーター。 ほとんどのプロバイダーでは、省略可能なパラメーターを指定する必要はありません。
プロバイダーを ETW プロバイダー グループに関連付ける場合は、 TraceLoggingOptionGroup マクロを追加してプロバイダーのグループ GUID を指定します。 それ以外の場合は、パラメーターを __VA_ARGS__
指定しないでください。
戻り値
なし
解説
トレース ログ プロバイダーは、イベントを ETW に送信できる接続です。 マクロは TRACELOGGING_DEFINE_PROVIDER
TraceLogging プロバイダーを定義し、それにアクセスするために使用できるハンドルを作成します。 また、プロバイダーの名前や GUID などのプロバイダー情報も記録します。
トレース ログ プロバイダーのハンドルを定義するには、このマクロを .c または .cpp ファイルで呼び出す必要があります。 たとえば、プロバイダーに名前が付けられ MyCompany.MyComponent
、コントロール GUID が である場合は {ce5fa4ea-ab00-5402-8b76-9f76ac858fb5}
、コンポーネント内の .c ファイルまたは .cpp ファイルのいずれかに次のコードを追加してプロバイダーを定義します。
TRACELOGGING_DEFINE_PROVIDER( // defines g_hProvider
g_hProvider, // Name of the provider handle
"MyCompany.MyComponent", // Human-readable name for the provider
// {ce5fa4ea-ab00-5402-8b76-9f76ac858fb5}
(0xce5fa4ea,0xab00,0x5402,0x8b,0x76,0x9f,0x76,0xac,0x85,0x8f,0xb5));
上記 TRACELOGGING_DEFINE_PROVIDER
のマクロは、次のようなコードのように、プロバイダー ハンドル定数を g_hMyProvider
定義すると考えることができます。
const TraceLoggingHProvider g_hMyProvider = ...;
結果のハンドルにはモジュール スコープがあり、定義されている EXE、DLL、または SYS モジュール内の任意の場所で使用できます。 必要に 応じて TRACELOGGING_DECLARE_PROVIDER マクロ (ヘッダーなど) を使用してハンドルを前方宣言し、コンポーネント内の他の .c ファイルまたは.cpp ファイルで使用できるようにします。
コンポーネントの実行が開始されると、プロバイダーは未登録の状態になります。
それを使用してイベントを生成しようとすると、警告なしに無視されます。 書き込み呼び出しに応答するには、 TraceLoggingRegister を使用してプロバイダーを登録する必要があります。 これは通常、コンポーネントの起動時 (、 など) にmain
DllMain(DLL_PROCESS_ATTACH)
wmain
WinMain
DriverEntry
行われます。 コンポーネントのシャットダウン時に、 TraceLoggingUnregister を呼び出してプロバイダーの登録を解除します。
注意
によって定義された TRACELOGGING_DEFINE_PROVIDER
プロバイダー ハンドルは、モジュールにスコープが設定されます。 ハンドルは、EXE、DLL、または SYS ファイル内で必要に応じて使用できますが、モジュールの範囲外で使用しないでください。つまり、同じプロセスで他の DLL に渡さないでください。 各 EXE、DLL、または SYS ファイルは、独自のプロバイダー ハンドルを使用する必要があり、独自の Register と Unregister を実行する必要があります。 デバッグ ビルドでは、別のモジュールからプロバイダー ハンドルを使用して書き込もうとすると、アサーションが起動します。
プロバイダー名と ID
ETW は、プロバイダー ID (プロバイダー GUID またはコントロール GUID とも呼ばれます) を使用して、イベントのフィルター処理とルーティングを実行します。 たとえば、プロバイダー ID {ce5fa4ea-ab00-5402-8b76-9f76ac858fb5}
を持つ という名前MyCompany.MyComponent
のプロバイダーがある場合は、 のような tracelog -start MySessionName -f MySession.etl -guid #ce5fa4ea-ab00-5402-8b76-9f76ac858fb5
tracelog コマンドを使用して、このプロバイダーからイベントをキャプチャするトレースを開始できます。
すべての ETW プロバイダーは、プロバイダー名とプロバイダー ID の両方で識別されます。 他のプロバイダーと競合しないように、名前と ID の両方が一意である必要があります。 さらに、名前と ID をリンクする必要があります。ETW プロバイダーの特定の ID で特定の名前を使用すると、その名前は他の ID と共に使用しないでください。その ID は他の名前と共に使用しないでください。
プロバイダー ID には、SDK ツールまたは https://uuidgen.orgを使用して生成される任意の一意の guidgen
GUID を指定できます。ただし、プロバイダー ID にランダムに生成された GUID を使用する代わりに、以下で説明する ETW 名ハッシュ アルゴリズムを使用してプロバイダー名からプロバイダー ID を生成することをお勧めします。 これにはいくつかの利点があります。名前だけを覚える方が簡単です。ID と名前は自動的にリンクされます。tracelog、traceview、EventSource、WPR などのツールでは、このアルゴリズムを使用して生成された ID を使用するプロバイダーが特別にサポートされています。
たとえば、プロバイダー ID {ce5fa4ea-ab00-5402-8b76-9f76ac858fb5}
を持つ という名前MyCompany.MyComponent
のプロバイダーがある場合は、 のような tracelog -start MySessionName -f MySession.etl -guid *MyCompany.MyComponent
tracelog コマンドを使用して、このプロバイダーからイベントをキャプチャするトレースを開始できます。
これは、プロバイダー名 MyCompany.MyComponent
をハッシュすることによってプロバイダー ID が{ce5fa4ea-ab00-5402-8b76-9f76ac858fb5}
生成されたために機能するため、tracefmt ツールは と同等であると見-guid *MyCompany.MyComponent
な-guid #ce5fa4ea-ab00-5402-8b76-9f76ac858fb5
されます。
PowerShell を使用すると、 EventSource クラスを介して ETW 名ハッシュ アルゴリズムを使用して、特定のプロバイダー名のプロバイダー ID を取得できます。
[System.Diagnostics.Tracing.EventSource]::new("MyCompany.MyComponent").Guid
結果:
Guid
----
ce5fa4ea-ab00-5402-8b76-9f76ac858fb5
C# では、ETW 名ハッシュ アルゴリズムを次のように実装できます。
static Guid ProviderIdFromName(string name)
{
var signature = new byte[] {
0x48, 0x2C, 0x2D, 0xB2, 0xC3, 0x90, 0x47, 0xC8,
0x87, 0xF8, 0x1A, 0x15, 0xBF, 0xC1, 0x30, 0xFB };
var nameBytes = System.Text.Encoding.BigEndianUnicode.GetBytes(name.ToUpperInvariant());
using (var sha1 = new System.Security.Cryptography.SHA1Managed())
{
sha1.TransformBlock(signature, 0, signature.Length, null, 0);
sha1.TransformFinalBlock(nameBytes, 0, nameBytes.Length);
var hash = sha1.Hash;
Array.Resize(ref hash, 16);
hash[7] = (byte)((hash[7] & 0x0F) | 0x50);
return new Guid(hash);
}
}
例
#include <windows.h> // or <wdm.h> for kernel-mode.
#include <winmeta.h> // For event level definitions.
#include <TraceLoggingProvider.h>
TRACELOGGING_DEFINE_PROVIDER( // defines g_hProvider
g_hProvider, // Name of the provider handle
"MyCompany.MyComponent", // Human-readable name for the provider
// {ce5fa4ea-ab00-5402-8b76-9f76ac858fb5}
(0xce5fa4ea,0xab00,0x5402,0x8b,0x76,0x9f,0x76,0xac,0x85,0x8f,0xb5));
int main(int argc, char* argv[]) // or DriverEntry for kernel-mode.
{
TraceLoggingRegister(g_hProvider);
TraceLoggingWrite(
g_hProvider,
"MyEvent1",
TraceLoggingLevel(WINEVENT_LEVEL_WARNING), // Levels defined in <winmeta.h>
TraceLoggingKeyword(MyEventCategories), // Provider-defined categories
TraceLoggingString(argv[0], "arg0"), // field name is "arg0"
TraceLoggingInt32(argc)); // field name is implicitly "argc"
TraceLoggingUnregister(g_hProvider);
return 0;
}
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows Vista [デスクトップ アプリのみ | UWP アプリ] |
サポートされている最小のサーバー | Windows Server 2008 [デスクトップ アプリ | UWP アプリ] |
対象プラットフォーム | Windows |
ヘッダー | traceloggingprovider.h |