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


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

Трассировка событий для 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);

элементы форматирования

ТипИмя
WPP использует это поле для идентификации сложного типа. Например, .*ls.

HelperMacroName
Вспомогательный макрос, который преобразует аргумент в массив переменной длины в формате пары length/address. Этот формат необходим для функции TraceMessage для каждого из записей в списке аргументов переменной.

Чтобы правильно отформатировать аргумент, необходимо использовать макрос WPP_LOGPAIR в определении вспомогательного макроса, как показано в следующем примере:

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

Примечание В зависимости от логики трассировки, которую требуется реализовать, может потребоваться определить макрос с помощью нескольких макросов WPP_LOGPAIR.

тип аргумента
Указывает значение, которое может принимать аргументы типа TypeName. Например, константа 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 байта.

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

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

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

Для полного списка параметров трассировки WPP и информации о том, как настроить их на странице свойств проекта, см. WPP препроцессор.