Win32 API 日本語リファレンス
ホーム › System.Diagnostics.Etw › PEVENT_RECORD_CALLBACK

PEVENT_RECORD_CALLBACK

コールバック

シグネチャ

void PEVENT_RECORD_CALLBACK(
    EVENT_RECORD* EventRecord
);

パラメーター

フィールド型説明
EventRecordEVENT_RECORD*イベント情報が格納された EVENT_RECORD 構造体へのポインターです。

公式ドキュメント

コンシューマーは、トレース処理セッションからイベントを受け取るためにこのコールバックを実装します。

PEVENT_RECORD_CALLBACK 型は、このコールバック関数へのポインターを定義します。EventRecordCallback は、アプリケーション定義の関数名のプレースホルダーです。

解説(Remarks)

イベントを配信するために ETW が呼び出す関数を指定するには、OpenTrace 関数に渡す EVENT_TRACE_LOGFILE 構造体の EventRecordCallback、Context、ProcessTraceMode の各メンバーを設定します。

メモ

EventRecordCallback 関数が ProcessTrace から壊れたデータを受け取っている場合は、OpenTrace に渡した EVENT_TRACE_LOGFILE 構造体の ProcessTraceMode フィールドに指定したフラグを再確認してください。EVENT_TRACE_LOGFILE の EventCallback フィールドと EventRecordCallback フィールドは、共用体の重なり合ったメンバーです。ProcessTraceMode フィールドに PROCESS_TRACE_MODE_EVENT_RECORD フラグが含まれている場合、ProcessTrace は EventRecordCallback の関数シグネチャでコールバックを呼び出します。含まれていない場合、ProcessTrace は EventCallback の関数シグネチャでコールバックを呼び出します。

OpenTrace でトレース処理セッションを作成した後、ProcessTrace 関数を呼び出すとイベントの受信が始まります。

ProcessTrace がトレースのイベント処理を開始すると、ログに記録されたイベントのデータではなく、トレースに関するデータ (メタデータ) を含む 1 つ以上の合成イベントでコールバックを呼び出すことがあります。これらの合成イベントでは、EventHeader.ProviderId に EventTraceGuid が設定され、EventHeader.EventDescriptor.Opcode は合成イベントの内容に応じて設定されます。たとえば、各トレースファイルの最初のイベントは、TRACE_LOGFILE_HEADER の情報を含む Opcode 0 の合成イベントになります。

それ以外に受け取るイベントには、すべてプロバイダー固有のイベントデータが含まれます。受け取ったイベントの種類は、EVENT_RECORD の EventHeader.ProviderId メンバーと EventHeader.EventDescriptor メンバーを使用して判別します。

ほとんどの場合、イベントは発生した順序 (タイムスタンプ順) でコールバックに配信されます。ただし、特定の状況では、イベントが元の順序どおりに配信されないことがあります。

技術的な詳細: イベントはバッファーに格納されます。各バッファーはバッファーストリームに割り当てられ、通常は CPU ごとに 1 つのストリームが割り当てられます。ProcessTrace の実装は、バッファー内のすべてのイベントがタイムスタンプ順に並んでいること、および各バッファーが、同じストリーム内の他のバッファーの期間と重ならない単一の時間範囲のイベントを含んでいることを前提としています。これらの前提が満たされない場合、ProcessTrace はイベントを順不同で配信することがあります。

リアルタイムのトレース収集セッションに、関連付けられたトレース処理セッションが存在しない場合、収集されたイベントはバッファーがいっぱいになるまでシステムによってバッファリングされます。トレース処理セッションがリアルタイムのトレース収集セッションに接続すると、そのトレース処理セッションはまずセッションの合成イベントを受け取り、次にバッファリングされていたイベントを受け取り、その後、新たに生成されるリアルタイムイベントの受信を開始します。2 つ目のリアルタイム処理セッションが同じトレース収集セッションに接続した場合、そのセッションは合成イベントと新たに生成されるリアルタイムイベントを受け取ります (2 つ目のトレース処理セッションは、それより前のイベントを受け取りません)。

重要

リアルタイムセッションのイベントを処理する場合、処理コールバックが各イベントの処理に時間をかけすぎ、かつイベントの到着が速すぎると、処理が追いつかなくなります。システムはデータの損失を防ぐためにイベントをバッファリングしますが、これによりシステムリソースの使用量 (メモリやディスクの使用量など) が増加します。この問題を避けるには、セッションのフィルター (プロバイダーごとのレベルフィルターやキーワードフィルターなど) を使用して受信イベントのレートを下げ、コールバック内で早期にフィルタリングを行って完全な処理が不要なイベントをスキップし、処理スレッドをブロックしないようにコールバックができるだけ早く戻るよう最適化してください。

イベントデータの解釈に関する詳細については、Consuming Events と Retrieving Event Data Using TDH を参照してください。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)