SPTDump

SPTDump は、サンプル プロファイル誘導最適化(SPGO)ワークフローで使用されるサンプル プロファイル トレース(SPT)ファイルを調査するためのコマンドライン ツールです。 これを使用して、SPT メタデータとサンプル データを表示します。 SPD に変換する前にトレースの内容を検証し、SPD バージョンの不一致などの問題のトラブルシューティングを行います。

SPT ファイルには、アプリケーション ワークロードから収集された生のハードウェア パフォーマンス サンプル イベントが含まれています。

Syntax

SPTDump [オプション] sptfile

パラメーター

options
SPTDumpするには、次のオプションを指定します。

  • /すべての SPT ファイル全体を出力します。 このオプションが既定値です。
  • /ヘッダー SPT ファイル ヘッダーを出力します。
  • /Progid 出力プログラム ID (各バイナリの GUID と有効期間)。
  • /strtab 文字列テーブルを出力します。
  • /イベント サンプル イベントを出力します。
  • /ヘルプ ヘルプ情報を表示します。

sptfile
検査する SPT ファイルへのパス。

注釈

Note

Visual Studio開発者コマンド プロンプトからこのツールを起動します。

SPTDumpを使用して、サンプル プロファイル トレース (SPT) ファイルの内容を検査します。 SPTAggregate は、 xperfによって収集された ETL イベント トレース ログから SPT ファイルを生成します。 SPDConvert を使用して、SPT ファイルを SPD ファイル (サンプル プロファイル データベース) にインポートします。

"SPD バージョンに互換性がありません" エラーを診断するには、 /progid を使用して SPT ファイル内の各バイナリの GUID と有効期間を表示し、 SPDDump /headerを使用してそれらの値を SPD ファイルと比較します。

Example

次の例では、SPT ファイルの完全な内容を出力します。

SPTDump sample.spt

次の例では、SPT ファイル内のバイナリのプログラム ID (GUID と有効期間) のみを出力します。

SPTDump /progid sample.spt

SPT ヘッダーの形式

SPT ファイルは、32 バイトのヘッダー、文字列テーブル、プログラム ID テーブル、およびサンプル イベント データ ストリームを含むバイナリ形式です。 このドキュメントでは、バージョン 1 の形式について説明します。 今後レイアウトが変更されると、バージョン フィールドが更新されます。

SPT ヘッダーは 32 バイトです。

  • [0x00-0x03] Signature (uint32 LE) = 0x5350543A ("SPT:")
  • [0x04-0x07] バージョン (uint32 LE) = 1
  • [0x08-0x0B] RawDataId (uint32 LE) = 0 (未使用/予約済み)
  • [0x0C-0x0F] TargetArch (uint32 LE) = 0 (未使用/予約済み)
  • [0x10-0x13] StringTableOffset (uint32 LE) = バイナリ名の文字列テーブルへのオフセット (通常は0x20)
  • [0x14-0x17] ProgramIdTableOffset (uint32 LE) = RSDSKEY テーブルへのオフセット (通常は StringTableOffset+StringTableCapacity)
  • [0x18-0x19] StringTableUsed (uint16 LE) = 文字列テーブルで使用されるバイト数
  • [0x1A-0x1B] StringTableCapacity (uint16 LE) = 文字列テーブルに割り当てられたバイト数 (通常は0x4000)
  • [0x1C-0x1D] ProgramIdsUsed (uint16 LE) = プログラム ID の数 (多くの場合、1 つだけ)
  • [0x1E-0x1F] ProgramIdCapacity (uint16 LE) = プログラム ID (通常は0x100) の数 (バイト単位ではない) の容量

StringTable は、指定したオフセットのヘッダーの直後にあります。 これには、null で終わる UTF-8 バイナリ ファイル名が含まれています。

ProgramIdTable は、指定したオフセットの StringTable に従います。 各エントリは 24 バイトです。StringTable への 16 バイトのリッチ 署名データ ストリーム (RSDS) GUID + 4 バイトの有効期間 + 4 バイトの文字列インデックス。

データ ストリームは ProgramIdTableOffset + (ProgramIdCapacity * 24)から始まり、 SPT_OP_BINARY_ID オペコードで始まります。

SPT オペコード

以下の説明では:

  • RVA は、バイナリ内の命令の 32 ビット相対仮想アドレス、つまりモジュール内のオフセットを意味します。
  • LE は、リトル エンディアンバイト順を意味します。

SPT_OP_REPEAT (0x82)
指定した回数だけ次のレコードを繰り返します。 繰り返し数が 2 の場合は、合計で 3 つの同じレコードがあることを意味します。 繰り返しカウントは、処理後にリセットされます。
レイアウト: 1 バイト: オペコード 0x82。 1バイト: パディング。 8 バイト: 繰り返しカウント (uint64 LE)

SPT_OP_UNHALT_CYCLESPT_OP_RETIRE_INSTRSPT_OP_RETIRE_BR_INSTRSPT_OP_L1_ICACHE_MISSSPT_OP_L1_DCACHE_MISSSPT_OP_ETW_INSTR (0x01、0x02、0x03、0x04、0x05、0x41)
レイアウト: 1 バイト: オペコード。 1 バイト: RVA の数 (N)。 4N バイト: N 個の RVA(各 uint32 LE)
各 RVA は、IP サンプル ヒット 数 = 1 + 繰り返しカウントを表します。

SPT_OP_LBR (0x10)
レイアウト: 1 バイト: オペコード 0x10。 1 バイト: イベント数 (N)。 8N バイト: N 個の LBR ペア。各ペアは次のとおり: 4 バイト: To RVA (uint32 LE)、4 バイト: From RVA (uint32 LE)
各ペアは、ヒットカウント = 1 + 繰り返しカウントを持つ分岐円弧を表します。

SPT_OP_ETW_CALLSTACK (0x42)
レイアウト: 1 バイト: オペコード 0x42。 1 バイト: RVA 数 (N)。 4N バイト: スタックフレームを表す N 個の RVA (各々 uint32 LE)。
いつ:

  • N = 2: 2 つの RVA で 1 つのスタック アークを形成する (RVA[0], RVA[1])
  • N > 2: 連続するペアから N-1 アークを作成します。(RVA[0]->RVA[1]),(RVA[1]->RVA[2]), ..., (RVA[N-2]->RVA[N-1]) 各系列は、単一のアークまたは連続するペアであるかどうかに関係なく、ヒット カウント = 1 + 繰り返しカウントを持っています。

SPT_OP_BINARY_ID (0x81)
レイアウト: 1 バイト: オペコード 0x81。 1 バイト: パディング。 2 バイト: プログラム ID (uint16 LE)。 4 バイト: このセグメントの合計データ長 (uint32 LE)。
インデックス ID で指定された特定のバイナリのデータ レコードの先頭をマークします。 インデックス ID は、SPT ヘッダーの RSDSKey およびバイナリ名文字列テーブルを参照します。
データ長には、4 バイト長フィールド自体が含まれます。 このオペコードは、データ ストリーム内で複数回発生する可能性があります。

こちらも参照ください

チュートリアル: サンプル プロファイル ガイド付き最適化 (SPGO) を使用してパフォーマンスを改善する
SPDConvert
SPDDump
SPTAggregate