SPTDump

SPTDump är ett kommandoradsverktyg för att inspektera SPT-filer (Sample Profile Trace) som används i SPGO-arbetsflöden (Sample Profile-Guided Optimization). Använd den för att visa SPT-metadata och exempeldata. Validera spårinnehåll före konvertering till SPD och felsök problem, till exempel felmatchningar mellan SPD-versioner.

En SPT-fil innehåller råa exempelhändelser för maskinvaruprestanda som samlats in från en programarbetsbelastning.

Syntax

SPTDump [alternativ] sptfile

Parameters

alternativ
Ange följande alternativ till SPTDump:

  • /all Skriver ut hela SPT-filen. Det här alternativet är standardinställningen.
  • /Huvudet Mata ut SPT-filrubriken.
  • /progid Visar program-ID:n (GUID och ålder för varje binärfil).
  • /strtab Mata ut strängtabellen.
  • /event Mata ut exempelhändelser.
  • /Hjälp Visa hjälpinformation.

sptfile
Sökvägen till SPT-filen som ska inspekteras.

Anmärkningar

Note

Starta det här verktyget från en utvecklarkommandotolk för Visual Studio.

Använd SPTDump för att granska innehållet i en SPT-fil (Sample Profile Trace). SPTAggregate skapar SPT-filer från ETL-händelsespårningsloggar som samlas in av xperf. Importera SPT-filer till en SPD-fil (exempelprofildatabas) med hjälp av SPDConvert.

Använd /progid för att visa GUID:en och åldern för varje binärfil i SPT-filen om du vill diagnostisera felet ”SPD-version inkompatibel”, och jämför sedan dessa värden med SPD-filen med SPDDump /header.

Example

Det här exemplet matar ut det fullständiga innehållet i en SPT-fil:

SPTDump sample.spt

I det här exemplet matas endast program-ID:t (GUID och ålder) ut för binärfiler i en SPT-fil:

SPTDump /progid sample.spt

SPT-rubrikformat

SPT-filen är ett binärt format med en 32-bytesrubrik, strängtabell, program-ID-tabell och exempelhändelsedataström. Det här dokumentet beskriver version 1 av formatet. Versionsfältet uppdateras om layouten ändras i framtiden.

SPT-huvudet är 32 byte:

  • [0x00-0x03] Signatur (uint32 LE) = 0x5350543A ("SPT:")
  • [0x04-0x07] Version (uint32 LE) = 1
  • [0x08-0x0B] RawDataId (uint32 LE) = 0 (oanvänd/reserverad)
  • [0x0C-0x0F] TargetArch (uint32 LE) = 0 (oanvänd/reserverad)
  • [0x10-0x13] StringTableOffset (uint32 LE) = förskjutning till strängtabell med binärt namn (vanligtvis 0x20)
  • [0x14-0x17] ProgramIdTableOffset (uint32 LE) = förskjutning till RSDSKEY-tabell (vanligtvis StringTableOffset+StringTableCapacity)
  • [0x18-0x19] StringTableUsed (uint16 LE) = byte som används i strängtabell
  • [0x1A-0x1B] StringTableCapacity (uint16 LE) = byte som allokerats i strängtabellen (vanligtvis 0x4000)
  • [0x1C-0x1D] ProgramIdsUsed (uint16 LE) = antal program-ID:n (ofta bara 1)
  • [0x1E-0x1F] ProgramIdCapacity (uint16 LE) = kapacitet i antal (inte byte) för program-ID :n (vanligtvis 0x100)

StringTable följer omedelbart efter huvudet med det angivna offsetvärdet. Den innehåller ett null-avslutat UTF-8 binärt filnamn.

ProgramIdTable följer efter StringTable med den angivna förskjutningen. Varje post är 24 byte: en 16-byte Rich Signature Data Stream (RSDS)-GUID + 4-byte åldersvärde + 4-byte strängindex i StringTable.

Dataströmmen börjar vid ProgramIdTableOffset + (ProgramIdCapacity * 24)och börjar med en SPT_OP_BINARY_ID opcode.

SPT Opcodes

I följande beskrivningar:

  • RVA avser den 32-bitars relativa virtuella adressen för en instruktion i binärfilen, det vill säga dess offset i modulen.
  • LE betyder lite endiansk byteordning.

SPT_OP_REPEAT (0x82)
Upprepa nästa post för det angivna antalet gånger. Ett upprepningsantal på 2 innebär att det finns totalt 3 identiska poster. Antalet upprepningar återställs efter bearbetningen.
Layout: 1 byte: opcode 0x82. 1 byte: utfyllnad. 8 byte: upprepningsantal (uint64 LE)

SPT_OP_UNHALT_CYCLE, SPT_OP_RETIRE_INSTR, SPT_OP_RETIRE_BR_INSTR, SPT_OP_L1_ICACHE_MISS, SPT_OP_L1_DCACHE_MISS( SPT_OP_ETW_INSTR 0x01, 0x02, 0x03, 0x04, 0x05, 0x41)
Layout: 1 byte: opcode. 1 byte: antal RVA (N). 4N byte: N RVA:er (uint32 i LE-format vardera)
Varje RVA representerar ett ANTAL IP-exempelträffar = 1 + upprepat antal.

SPT_OP_LBR (0x10)
Struktur: 1 byte: operationskod 0x10. 1 byte: antal händelser (N). 8N byte: N LBR-par, varje par är: 4 byte: Till RVA (uint32 LE), 4 byte: Från RVA (uint32 LE)
Varje par representerar en grenbåge med träffantalet = 1 + antal upprepningar.

SPT_OP_ETW_CALLSTACK (0x42)
Layout: 1 byte: opcode 0x42. 1 byte: antal RVA:er (N). 4N byte: N RVA:er (uint32 LE varje, som motsvarar stackramar).
När:

  • N = 2: Två RVA:er bildar en enda stackbåge (RVA[0], RVA[1])
  • N > 2: Skapar N-1 bågar av på varandra följande par: (RVA[0]->RVA[1]), (RVA[1]->RVA[2]), ..., (RVA[N-2]->RVA[N-1]) Varje serie, oavsett om den består av en enda båge eller av på varandra följande par, har träffantal = 1 + upprepningsantal.

SPT_OP_BINARY_ID (0x81)
Layout: 1 byte: opcode 0x81. 1 byte: utfyllnad. 2 byte: program-ID (uint16 LE). 4 byte: total datalängd i det här segmentet (uint32 LE).
Markerar början av dataposter för en specifik binär fil som anges av ett index-ID. Index-ID:t refererar tillbaka till strängtabellen RSDSKey och det binära namnet i SPT-huvudet.
Datalängden innehåller själva fältet med 4 bytes längd. Den här opcode-koden kan inträffa flera gånger i en dataström.

Se även

Självstudie: Använda SPGO (Sample Profile-Guided Optimization) för att förbättra prestanda
SPDConvert
SPDDump
SPTAggregate