SPTDump

SPTDump 는 SPGO(샘플 Profile-Guided 최적화) 워크플로에 사용되는 SPT(샘플 프로필 추적) 파일을 검사하기 위한 명령줄 도구입니다. SPT 메타데이터 및 샘플 데이터를 보는 데 사용합니다. SPD로 변환하기 전에 추적 내용의 유효성을 검사하고 SPD 버전 불일치와 같은 문제를 해결합니다.

SPT 파일에는 애플리케이션 워크로드에서 수집된 원시 하드웨어 성능 샘플 이벤트가 포함됩니다.

Syntax

SPTDump [옵션] sptfile

매개 변수

옵션
다음 옵션을 SPTDump에 지정하십시오:

  • /모든 전체 SPT 파일을 출력합니다. 이 옵션이 기본값입니다.
  • /헤더 SPT 파일 헤더를 출력합니다.
  • /progid 프로그램 ID(GUID 및 각 바이너리의 age)를 출력합니다.
  • /strtab 문자열 테이블을 출력합니다.
  • /이벤트 출력 샘플 이벤트입니다.
  • /도움말 도움말 정보를 표시합니다.

sptfile
검사할 SPT 파일의 경로입니다.

비고

참고

Visual Studio 개발자 명령 프롬프트에서 이 도구를 시작합니다.

SPT(샘플 프로필 추적) 파일의 내용을 검사하는 데 사용합니다 SPTDump . SPTAggregate는 에 의해 xperf수집된 ETL 이벤트 추적 로그에서 SPT 파일을 생성합니다. SPDConvert를 사용하여 SPD 파일(샘플 프로필 데이터베이스)로 SPT 파일을 가져옵니다.

"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(Rich Signature Data Stream) GUID + 4바이트 기간 + StringTable의 4바이트 문자열 인덱스입니다.

데이터 스트림은 ProgramIdTableOffset + (ProgramIdCapacity * 24)에서 시작하며, SPT_OP_BINARY_ID opcode로 시작합니다.

SPT Opcodes

다음 설명에서:

  • RVA는 바이너리 내 명령어의 32비트 상대 가상 주소, 즉 모듈 내 오프셋을 의미합니다.
  • LE는 리틀 엔디언 바이트 순서를 의미합니다.

SPT_OP_REPEAT (0x82)
지정된 횟수만큼 다음 레코드를 반복합니다. 반복 횟수 2는 총 3개의 동일한 레코드가 있음을 의미합니다. 반복 횟수는 처리 후 다시 설정됩니다.
레이아웃: 1 바이트: opcode 0x82. 1바이트: 패딩. 8바이트: 반복 횟수(uint64 LE)

SPT_OP_UNHALT_CYCLE, SPT_OP_RETIRE_INSTR, SPT_OP_RETIRE_BR_INSTR, SPT_OP_L1_ICACHE_MISS, , SPT_OP_L1_DCACHE_MISSSPT_OP_ETW_INSTR(0x01, 0x02, 0x03, 0x04, 0x05, 0x41)
레이아웃: 1바이트: 연산 코드. 1바이트: RVA 수(N). 4N 바이트: RVA N개(각각 uint32 LE)
각 RVA는 IP 샘플 적중 횟수 = 1 + 반복 횟수를 나타냅니다.

SPT_OP_LBR (0x10)
레이아웃: 1 바이트: opcode 0x10. 1 바이트: 이벤트 수(N). 8N바이트: N개의 LBR 쌍, 각 쌍의 구성은 다음과 같음: 4바이트: 대상 RVA(uint32 LE), 4바이트: 출발 RVA(uint32 LE)
각 쌍은 히트 수가 1 + 반복 횟수인 분기 아크를 나타냅니다.

SPT_OP_ETW_CALLSTACK (0x42)
레이아웃: 1 바이트: opcode 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 바이트: opcode 0x81. 1바이트: 패딩. 2바이트: 프로그램 ID(uint16 LE). 4바이트: 이 세그먼트의 총 데이터 길이(uint32 LE).
인덱스 ID로 지정된 특정 이진 파일에 대한 데이터 레코드의 시작을 표시합니다. 인덱스 ID는 SPT 헤더의 RSDSKey 및 이진 이름 문자열 테이블을 다시 참조합니다.
데이터 길이에는 4 바이트 길이 필드 자체가 포함됩니다. 이 opcode는 데이터 스트림에서 여러 번 발생할 수 있습니다.

참고하십시오

자습서: 샘플 프로필 기반 최적화(SPGO)를 사용하여 성능을 향상시키기
SPDConvert
SPDDump
SPTAggregate