Поделиться через


Каков синтаксис определения сложных типов?

Трассировка событий Windows (ETW) определяет несколько простых и сложных типов для использования в функциях трассировки. Эти типы объявляются в файле 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
Указывает тип формата управляемого объекта (MOF), распознаваемый препроцессором WPP.

WppMofFormat
Указывает описатель формата, например "s", который распознается препроцессором WPP.

TypeSignature
Строка, добавляемая к имени функции, чтобы связать ее со сложным типом. Между символами подчеркивания должен быть один или несколько символов. Например, _xwcs_t_.

Приоритет
Этот элемент зарезервирован и должен иметь нулевое значение.

Слоты
Указывает максимальное количество параметров переменной длины, которые препроцессор WPP передает функции TraceMessage для этого сложного типа. Этот элемент форматирования является необязательным. WPP использует значение по умолчанию 1, если этот элемент не указан.

Пример

Чтобы определить сложный тип, выполните следующие действия.

  1. Создайте локальный файл конфигурации. Этот файл должен содержать макрос DEFINE_CPLX_TYPE, определяющий сложный тип.

  2. Укажите локальный файл конфигурации для препроцессора WPP. Откройте свойства проекта. В разделе Трассировка WPPпараметры файла используйте поле Дополнительный файл конфигурации , чтобы указать имя файла конфигурации (параметр-ini ). Обязательно включите трассировку WPP, задав для параметра Запуск WPP значение Да. Дополнительные сведения см. в разделе Препроцессор WPP.

Например, можно создать локальный файл конфигурации (Localwpp.ini), который определяет сложный тип с именем .*ls. Сложный тип определяется следующим образом:

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 байта.

Когда трассировка событий Windows интерпретирует определение WPP_LOGXWCS, она помещает 2-байтовую строку в буфер, в который интерпретируется первый макрос WPP_LOGPAIR . EtW затем копирует все байты строки в буфер, когда трассировка событий Windows интерпретирует второй макрос WPP_LOGPAIR.

Так как вы указали длину отдельно от данных, WPP_LOGXWCS использует два слота TraceMessage. Таким образом, число 2 является восьмым аргументом.

При вызове препроцессора WPP используйте параметр Игнорировать восклицательные знаки (-noshrieks). Это помогает WPP распознать сложный тип, имя которого не заключено в восклицательные знаки (!), также известное как "крики".

Полный список параметров трассировки WPP и сведения о том, как их задать на странице свойств проекта, см. в разделе Препроцессор WPP.