SPTDump

SPTDump 是一个命令行工具,用于检查样本剖析引导优化(SPGO)工作流中使用的样本剖析轨迹(SPT)文件。 使用它查看 SPT 元数据和示例数据。 在转换为 SPD 之前验证跟踪内容,并排查 SPD 版本不匹配等问题。

SPT 文件包含从应用程序工作负荷收集的原始硬件性能示例事件。

Syntax

SPTDump [options] sptfile

参数

选项
SPTDump指定以下选项:

  • /所有 输出整个 SPT 文件。 此选项为默认值。
  • /header 输出 SPT 文件头部。
  • /progid 输出程序 ID(每个二进制文件的 GUID 和年龄)。
  • /strtab 输出字符串表。
  • /事件 输出示例事件。
  • /帮助 显示帮助信息。

sptfile
要检查的 SPT 文件的路径。

注解

注释

从Visual Studio开发人员命令提示符启动此工具。

使用 SPTDump 检查采样配置文件跟踪(SPT)文件的内容。 SPTAggregate 从 ETL xperf事件跟踪日志中生成 SPT 文件。 使用 SPDConvert 将 SPT 文件导入 SPD 文件(示例配置文件数据库)。

若要诊断“SPD 版本不兼容”错误,请使用 /progid 显示 SPT 文件中每个二进制文件的 GUID 和 age 值,然后使用 SPDDump /header 将这些值与 SPD 文件进行比较。

Example

此示例输出 SPT 文件的完整内容:

SPTDump sample.spt

此示例仅输出 SPT 文件中二进制文件的程序 ID(GUID 和年龄):

SPTDump /progid sample.spt

SPT 标头格式

SPT 文件是具有 32 字节标头、字符串表、程序 ID 表和示例事件数据流的二进制格式。 本文档介绍格式的版本 1。 如果布局将来发生更改,版本字段将更新。

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 字节的 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_INSTR、、SPT_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 小端序)
每个 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 个字节:程序 ID(uint16 LE)。 4 字节:此段的总数据长度(uint32 LE)。
标记索引 ID 指定的特定二进制数据记录的开始。 索引 ID 对应于 SPT 头中的 RSDSKey 和二进制名称字符串表。
数据长度包括 4 字节长度字段本身。 此操作码可以在数据流中多次发生。

另请参阅

教程:使用采样剖析引导优化(SPGO)提升性能
SPDConvert
SPDDump
SPTAggregate