다음을 통해 공유


복합 형식 정의의 구문은 무엇인가요?

ETW(Windows용 이벤트 추적)는 추적 함수에 사용할 몇 가지 단순하고 복잡한 형식을 정의합니다. 이러한 형식은 Defaultwpp.ini 파일에 선언됩니다. 그러나 사용자 고유의 사용자 지정 구성 파일을 만들고 이를 사용하도록 WPP를 직접 만들 수 있습니다.

DEFINE_CPLX_TYPE 복합 데이터 형식의 형식은 다음과 같습니다.

DEFINE_CPLX_TYPE(TypeName, HelperMacroName, ArgumentType, WppMofType,"WppMofFormat", TypeSignature, Priority, Slots);

예를 들면 다음과 같습니다.

DEFINE_CPLX_TYPE(.*ls, WPP_LOGXWCS, const xwcs_t&, ItemPWString,"s", _xwcs_t_, 0, 2);

요소 서식 지정

Typename
WPP는 이 필드를 사용하여 복합 형식을 식별합니다. 예를 들어 .*ls입니다.

HelperMacroName
인수를 길이/주소 쌍 형식의 가변 길이 배열로 변환하는 도우미 매크로입니다. 이 형식은 변수 인수 목록의 각 항목에 대해 TraceMessage 함수에 필요합니다.

인수의 형식을 올바르게 지정하려면 다음 예제와 같이 도우미 매크로 정의에 WPP_LOGPAIR 매크로를 사용해야 합니다.

#define HelperMacroName(x) WPP_LOGPAIR(length, x)

참고 구현하려는 추적 논리에 따라 여러 WPP_LOGPAIR 매크로를 사용하여 매크로를 정의해야 할 수 있습니다.

인수 형식
TypeName 형식의 인수가 허용할 수 있는 값을 나타냅니다. 예를 들어 const xwcs_t&.

WppMofType
WPP 전처리기에서 인식되는 MOF(Managed Object Format) 형식을 지정합니다.

WppMofFormat
WPP 전처리기에서 인식되는 형식 지정자(예: "s")를 지정합니다.

TypeSignature
복합 형식과 연결하기 위해 함수 이름에 추가된 문자열입니다. 밑줄 사이에는 단일 문자 또는 여러 문자가 있어야 합니다. 예를 들어 _xwcs_t_.

우선 순위
이 요소는 예약되어 있으며 0으로 설정해야 합니다.

슬롯
WPP 전처리기가 이 복합 형식의 TraceMessage 함수에 전달하는 최대 가변 길이 매개 변수 수를 지정합니다. 이 형식 요소는 선택 사항입니다. 이 요소가 지정되지 않은 경우 WPP는 기본값 1을 사용합니다.

예제

복합 형식을 정의하려면 다음을 수행합니다.

  1. 로컬 구성 파일을 만듭니다. 이 파일에는 복합 형식을 정의하는 DEFINE_CPLX_TYPE 매크로가 포함되어야 합니다.

  2. WPP 전처리기에서 로컬 구성 파일을 지정합니다. 프로젝트 속성을 엽니다. WPP 추적, 파일 옵션에서 추가 구성 파일 필드를 사용하여 구성 파일의 이름(-ini 매개 변수)을 지정합니다. WPP 실행을 예로 설정하여 WPP 추적을 사용하도록 설정해야 합니다. 자세한 내용은 WPP 전처리기를 참조하세요.

예를 들어 .*ls라는 복합 형식을 정의하는 로컬 구성 파일(Localwpp.ini)을 만들 수 있습니다. 다음과 같은 방법으로 복합 형식을 정의합니다.

DEFINE_CPLX_TYPE(.*ls, WPP_LOGXWCS, const xwcs_t&, ItemPWString,"s", _xwcs_t_, 0, 2);

그런 다음 WPP에 다음과 같은 형식 .*ls가 표시되면 다음을 수행합니다.

printf("my string is %.*ls", value);

WPP는 다음 스테이징 함수를 생성합니다(여기서 SF 는 "스테이징 함수"를 나타임).

WPP_SF__xwcs_t_(..., const xwcs_t& a1) {
    TraceMessage(..., WPP_LOGXWCS(a1) 0);
}

그런 다음 WPP는 다음 문자열과 같은 MOF 항목을 생성합니다. 여기서 .*ls 형식 이름은 적절한 MOF 형식 %s으로 바뀝니다.

"my string is %s"
{
    Value, ItemPWString
}

또한 형식에 대한 구조체(예: )를 생성합니다.

struct xwcs_t {
      WCHAR*    _buf;
      short     _len;
      xwcs_t(short buf, short len):_buf(buf),_len(len){}
};

이제 다음과 같이 데이터 형식을 xwstr_t 형식의 문자열로 결합하는 매크로를 추가합니다.

#define WPP_LOGXWCS(x) WPP_LOGPAIR(2, &(x)._len) WPP_LOGPAIR((x)._len, (x)._buf)

여기서 ItemPWString 은 WPP에서 인식되는 계산된 유니코드 문자열 형식입니다. 길이는 2바이트로 지정됩니다.

ETW는 WPP_LOGXWCS 정의를 해석할 때 첫 번째 WPP_LOGPAIR 매크로가 해석되는 버퍼에 2 바이트 문자열을 넣습니다. ETW는 두 번째 WPP_LOGPAIR 매크로를 해석할 때 문자열의 모든 바이트를 버퍼에 복사합니다.

데이터와 별도로 길이를 지정했기 때문에 WPP_LOGXWCS TraceMessage의 두 슬롯을 사용합니다. 따라서 숫자 2 는 8번째 인수입니다.

WPP 전처리기를 호출할 때 느낌표 무시 옵션(-noshrieks)을 사용합니다. 이를 통해 WPP는 "비명"이라고도 하는 느낌표(!)로 묶이지 않은 이름의 복합 형식을 인식할 수 있습니다.

WPP 추적 옵션의 전체 목록과 프로젝트 속성 페이지에서 설정하는 방법에 대한 자세한 내용은 WPP 전처리기를 참조하세요.