SPTDump

SPTDump 是一個命令列工具,用於檢視在取樣設定檔導向最佳化(SPGO)工作流程中使用的取樣設定檔追蹤(SPT)檔案。 用它來查看 SPT 的元資料和樣本資料。 在轉換為 SPD 前驗證追蹤內容,並排查如 SPD 版本不符等問題。

SPT 檔案包含從應用程式工作負載收集的原始硬體效能樣本事件。

Syntax

SPTDump [選項] SPTFILE

參數

選項
請向 SPTDump 指定以下選項:

  • /全部 輸出整個 SPT 檔案。 這個選項是預設值。
  • /標頭 輸出 SPT 檔案標頭。
  • /progid 輸出程式 ID(GUID 及每個二進位檔的年齡)。
  • /strtab 輸出字串表。
  • /事件 輸出樣本事件。
  • /help 顯示說明資訊。

SPTFILE
要檢查的 SPT 檔案路徑。

備註

備註

從 Visual Studio 開發者命令提示字元啟動此工具。

SPTDump 來檢查範例剖面追蹤(SPT)檔案的內容。 SPTAggregate 會從 ETL 事件 xperf追蹤日誌中產生 SPT 檔案。 使用 SPDConvert 將 SPT 檔案匯入 SPD 檔案(範例設定資料庫)。

若要診斷「SPD 版本不相容」錯誤,請使用 /progid 顯示 SPT 檔案中各個二進位檔的 GUID 和存留期,然後再使用 SPDDump /header 將這些值與 SPD 檔案進行比對。

Example

此範例輸出 SPT 檔案的完整內容:

SPTDump sample.spt

此範例僅輸出 SPT 檔案中二進位檔案的程式識別碼(GUID 和存留期):

SPTDump /progid sample.spt

SPT 標頭格式

SPT 檔案是一種二進位格式,包含 32 位元組標頭、字串表、程式 ID 表及範例事件資料流。 本文件描述格式的版本一。 如果未來版面有變動,版本欄位也會更新。

SPT 標頭為 32 位元組:

  • [0x00-0x03] 簽名(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 位元組:16 位元組的 Rich Signature Data Stream (RSDS) GUID + 4 位元組的 age 值 + StringTable 中的 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_MISS, ( SPT_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 位元組:至 RVA(uint32 LE),4 位元組:來自 RVA(uint32 LE)
每一對代表一個分支弧,其命中次數 = 1 + 重複次數。

SPT_OP_ETW_CALLSTACK (0x42)
版面配置:1 位元組:操作碼 0x42。 1 位元組:RVA 數量(N)。 4N 位元組:N 個 RVA(每個皆為 uint32 LE,代表堆疊影格)。
時機:

  • N = 2:兩個 RVA 形成一個堆疊弧(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 位元組:程式識別碼(uint16 LE)。 4 位元組:本區段的總資料長度(uint32 LE)。
標示由索引 ID 指定的特定二進位資料記錄的開始。 索引 ID 會回溯到 SPT 標頭中的 RSDSKey 與二進位名稱字串表。
資料長度包含了 4 位元組長度欄位本身。 此操作碼可在資料流中多次出現。

另請參閱

教學:使用範例設定檔引導最佳化(SPGO)來提升效能
SPDConvert
SPDDump
SPTAggregate