Какой синтаксис определения сложных типов?
Трассировка событий для 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, если этот элемент не указан.
Пример
Чтобы определить сложный тип, сделайте следующее:
Создайте локальный файл конфигурации. Этот файл должен содержать макрос DEFINE_CPLX_TYPE, определяющий сложный тип.
Укажите локальный файл конфигурации для препроцессора 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 препроцессор.