Windows 소프트웨어 트레이스 프리프로세서

Windows software trace preprocessor

Windows 소프트웨어 트레이스 프리프로세서(WPP, 프리프로세서 및 관련 서포트 툴은 WPP 소프트웨어 트레이스라고 불립니다)는 WMI 이벤트 트레이스를 사용하여 Windows 2000 이후의 운영 체제를 대상으로 하는 드라이버 및 응용 프로그램에서 효율적소프트웨어 트레이스를 구현하는 프리프로세서입니다.WPP는 Microsoft에 의해 작성되었으며 Windows DDK에 포함되어 있습니다.WPP는 적용 범위가 넓지만 Windows SDK에는 포함되어 있지 않기 때문에 주로 Windows DDK를 구입하는 소프트웨어 벤더가 제조하는 드라이버 및 드라이버 지원 소프트웨어에 사용됩니다.

배경

소프트웨어 추적은 프로그램 실행에 대한 정보를 기록하기 위해 로깅을 전문적으로 사용하는 것입니다.이 정보는 일반적으로 디버깅에 사용됩니다.이벤트 로깅의 주된 목적은 시스템 관리자(이벤트 뷰어 등)가 감사할 수 있는 이벤트 기록 작성 또는 관리 도구에 의해 분석되는 이벤트 기록 작성과 달리 소프트웨어 트레이스는 주로 소프트웨어 개발자에게 디버깅에 도움이 됩니다.따라서 로컬라이제빌리티나 표준 기반의 출력 형식 등 이벤트로깅의 비기능적 요건의 대부분은 소프트웨어 트레이스의 대부분의 어플리케이션에서 명시적으로 비목표입니다.한편, 소프트웨어 트레이스에는 일반적으로 이벤트로깅에서는 그다지 중요하지 않은 퍼포먼스에 대한 특별한 요건이 있습니다.예를 들어 소프트웨어 트레이스의 일반적인 사용인 in/out 트레이스는 엔트리 포인트와 함수 또는 메서드의 반환에서 출력을 생성하여 개발자가 디버거 또는 텍스트 기반 로그 파일에서 실행 경로를 시각적으로 추적할 수 있도록 합니다(이는 시퀀스 다이어그램의 런타임 아날로그로 볼 수 있습니다).이러한 유형의 추적은 개발자에게 유용하지만 소프트웨어 제품을 비활성화할 수 없는 경우(조건부 컴파일을 통한 컴파일 시 또는 플래그를 통한 런타임 시) 소프트웨어 제품의 성능을 크게 저하시킬 수 있습니다.

소프트웨어 트레이스에 관한 기타 고려사항은 다음과 같습니다.

  • 독점 소프트웨어에서는 데이터 추적에 제품의 소스 코드에 대한 중요한 정보가 포함될 수 있습니다.
  • 런타임에 트레이스를 유효 또는 무효로 하면, 많은 트레이스 방법에서는 대량의 추가 데이터를 바이너리에 포함할 필요가 있기 때문에, 트레이스가 무효가 되어 있어도 간접적으로 퍼포먼스가 저하될 수 있습니다.
  • 컴파일 시에 트레이스를 유효 또는 무효로 하고 있는 경우, 고객 머신상의 문제에 관한 트레이스 데이터를 취득하는 것은, 고객이 특별한 트레이스 유효 버전의 소프트웨어를 인스톨 할 수 있는가에 의해서 다릅니다.
  • 드라이버 등 특정 유형의 소프트웨어는 트레이스를 유효하게 해도 엄격한 퍼포먼스 요건을 충족해야 합니다.

처음 두 가지 고려사항 때문에 기존 소프트웨어 트레이스 방식에서는 조건부 컴파일을 사용하여 컴파일 시 트레이스(및 트레이스 데이터 포함)를 활성화 또는 비활성화합니다.예를 들어 C 프리프로세서를 사용하여 매크로를 정의할 수 있습니다.DebugOut다음과 같습니다.

#ifdefine _DEBUG #define DebugOut(msg, ...) \DebugPrintf(_FUNTION__('_FILE__'): TO_STRING(__LINE____)' \ msg, _ VAR_ARGS__) #elseine #define DebugOut(MS, ...endiff) #DebugOUT('...

어디에TO_STRING는 회선번호를 변환하는 매크로입니다( ).__LINE__)를 문자열로 변환합니다.DebugPrintf는 예를 들어 텍스트를 디버거에 출력하는 printf와 같은 함수입니다.

다음으로 다음 코드를 입력합니다.

Debug Out("오류 %d 발생\n", error_code");

는 디버깅 빌드에서만 다음과 같은 출력을 생성합니다.

SomeFunction(file.c:78) 오류 217이 발생하였습니다.

특정 유형의 트레이스(특히 인/아웃 트레이스)의 다른 기술은 계측을 사용하는 것입니다.이 기술은 많은 주요 문제에 대처할 수 있지만 항상 사용할 수 있는 것은 아닙니다(일반적으로 관리 대상 코드에서만).

WMI 이벤트 추적은 드라이버와 같은 성능에 중요한 코드에서 추적의 특정 성능에 대처하는 기술의 한 예입니다.또한 개발자가 사람이 읽을 수 있는 트레이스 데이터를 정의하도록 함으로써 중요한 트레이스 정보의 배포를 제어하는 문제에 대처할 수 있습니다."Error %d occurred\n"위의 예에서)는 제품에 내장되지 않도록 코드와 별도로 구분합니다(코드에서는 특정 메시지가 메시지 번호로 참조됩니다).단, 다음과 같은 중요한 제한이 있습니다.

  • WMI 이벤트 추적 자체로는 자동 생성되지 않습니다."SomeFunction(file.c:78)"트레이스 메시지의 일부입니다.이는 이러한 모든 기술의 제한이며 WMI 이벤트 추적에 한정되지 않습니다.
  • 트레이스 데이터의 사람이 읽을 수 있는 부분을 코드에서 분리하도록 요구하면 코드의 가독성을 저하시킬 수 있습니다.
  • 이 기술을 사용하면 "원샷" 트레이스 메시지에 상당한 개발 오버헤드가 발생할 수 있습니다.

WPP 동작

WPP는 컴파일 전(즉, C 프리프로세서 전)에 실행되어 처리되는 각 파일의 트레이스 메시지헤더를 생성합니다(디폴트로는 이 헤더는 다음과 같습니다).filename.tmh,어디에filename는 처리된 소스 파일의 이름입니다).이 헤더는 다음과 같이 소스 파일에 명시적으로 포함되어야 합니다.

// File: file.cxx // 이 파일은 WPP #include "file.tmh" 를 사용하는 예입니다.

C/C++ 구문에 대한 WPP의 이해는 매우 제한적입니다.특히 매크로를 확장하지 않으며(필요한 특수한 상황을 제외하고), 플러그마를 처리하거나 의미 분석을 수행하지 않습니다.

개발자는 컨피규레이션파일을 통해 WPP가 코멘트 내의 특별한 주석, 명령줄 파라미터 또는 이들 메서드의 조합을 처리할 필요가 있는1개 이상의 트레이스 매크로를 지정합니다.WPP는 처리해야 할 매크로 중 하나를 발견할 때마다 트레이스 메시지 매크로를 생성합니다.즉, 예를 들어DoTrace트레이스 매크로입니다.WPP는, 다음의 각 항목에 대해서 개별의 매크로를 생성합니다.DoTrace생성된 트레이스 메시지매크로는 파일명과 회선번호에 의해 명확화되며, WPP는 다양한 프리프로세서 트릭을 사용하여 원래의 트레이스 매크로를 정의하여 발생 시마다 적절한 트레이스 메시지 매크로를 전개합니다.

트레이스 메시지 매크로가 WPP에 의해 생성되는 방법은 템플릿파일에 의존합니다(파일 형식은 문서화되어 있지 않습니다).WPP에 포함된 기본 템플릿파일은 트레이스 메시지의 문자열을 주석에 포함하도록 지정합니다(Microsoft 컴파일러의 __notation 기능을 사용).이러한 문자열은 컴파일된 코드에 포함되지 않지만 WPP에 포함된 툴이 인식할 수 있는 형식으로 디버거 심볼 파일에 포함됩니다.트레이스 메시지 매크로에는 플래그를 통한 트레이스를 활성화 또는 비활성화하기 위한 로직과 WMI 이벤트트레이스 API 호출도 포함됩니다.

제한 사항

  • WPP는 매크로를 확장하지 않기 때문에 다른 매크로의 정의에 포함된 추적 매크로의 인스턴스화를 인식하지 않습니다.예를 들어,DoTrace트레이스 매크로 및CheckForErrors는 다음과 같이 정의됩니다.
#define CheckForErrors(error_code) \ if (IsError(error_code) \ { \ DoTrace("Error %d occurred\n", err ) ; \ HandleError(error_code) ; \ }

이 경우 WPP는 트레이스 메시지 매크로를 생성하지 않습니다.DoTrace어디에CheckForErrors일어나다.WPP는 이 문제에 대한 임시 회피책을 제공하지만 이 회피책을 사용해도 표현할 수 없는 작은 클래스의 매크로가 아직 존재합니다.

  • 기본 템플릿 파일은 Microsoft 컴파일러에서만 정상적으로 작동하는 코드를 생성합니다.이것이 프리프로세서의 본질적인 제한은 아니지만 템플릿파일(트레이스메시지 헤더에서 생성되는 코드를 제어하는 것)이 문서화되어 있지 않은 형식을 사용하고 있다는 것은 실제로는 WPP가 Microsoft 컴파일러에서만 정상적으로 동작한다는 것을 의미합니다.
  • 이전 버전의 WPP에서는 소스 파일에 여러 트레이스 매크로 헤더가 포함되어 있을 때(예를 들어 트레이스가 있는 소스 파일에 인라인 함수로 트레이스가 있는 헤더가 포함되어 있는 경우) 컴파일 오류가 발생했습니다.이것은 최신 버전에서 수정되었습니다.이는 템플릿파일의 제한이기도 하며 WPP 툴 자체가 아닙니다.
  • 트레이스 메시지매크로는 파일과 회선번호에 의해 명확해지기 때문에 소스 코드에는 1줄에 트레이스 매크로를 1개만 사용할 수 있습니다.

외부 링크