Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Вы создаете настраиваемые строки спецификации расширенного формата WPP с помощью макроса DEFINE_CPLX_TYPE. Дополнительные сведения об использовании этого макроса см. в разделе Что такое синтаксис определения сложных типов?.
В этом разделе приведены примеры, показывающие, как выполнить следующие действия.
В каждом из этих примеров показано использование пользовательского файла конфигурации WPP для определения макроса DEFINE_CPLX_TYPE. В этих примерах файл конфигурации называется LocalWpp.ini. Дополнительные сведения об использовании пользовательских файлов конфигурации WPP см. в статье Как определить пользовательские типы данных?.
Трассировка строк фиксированной длины с помощью настраиваемых строк спецификации расширенного формата WPP
В этом примере показано, как трассировать сетевые адреса протокола Интернета версии 6 (IPv6) с помощью настраиваемой строки спецификации расширенного формата WPP. Сетевые адреса IPv6, определенные структурой in6_addr, имеют длину фиксированной длины 16 байт.
В этом примере определен сложный тип данных (IPV6ADDR), который затем можно использовать в качестве %! IPV6ADDR! Строка спецификации форматирования в исходном коде.
Чтобы создать сложный тип данных IPV6ADDR, добавьте следующие инструкции в файл конфигурации LocalWpp.ini:
DEFINE_CPLX_TYPE(IPV6ADDR, WPP_LOGIPV6, in6_addr *, ItemIPV6Addr, "s", _IPV6_, 0, 1);
Эта инструкция использует макрос DEFINE_CPLX_TYPE для определения сложного типа (IPV6ADDR) вместе с его атрибутами, такими как тип аргумента (in6_addr *) и размер (16).
Утверждение также указывает имя вспомогательного макроса (WPP_LOGIPV6), который используется препроцессором WPP при анализе типа сложной структуры IPV6ADDR в исходном коде вашего поставщика трассировки .
WPP_FLAGS(-DWPP_LOGIPV6(x) WPP_LOGPAIR( (16), (x)));
Эта инструкция определяет вспомогательный макрос, используемый для форматирования пары длины и адреса аргумента IPV6 при передаче в функцию TraceMessage.
В Visual Studio откройте страницу свойств проекта. В разделе трассировки WPPпараметры файлаукажите LocalWpp.ini в качестве файла дополнительной конфигурации. Дополнительные сведения см. в препроцессоре WPP .
В следующем примере исходного кода показано, как поставщик трассировки может отслеживать сетевые адреса IPv6 с помощью %!IPV6ADDR! Строка спецификации формата:
struct in6_addr IPAddressV6 = {0};
DoTraceMessage(Noise, "IN6_ADDR = %!IPV6ADDR!", &IPAddressV6);
Примечание Можно создать сложный тип (MACADDR) для трассировки адресов управления доступом к мультимедиа с фиксированной длиной (MAC). Этот сложный тип можно указать, выполнив процедуру, используемую для IPV6ADDDR сложного типа.
Трассировка строк переменной длины с помощью настраиваемых строк спецификации расширенного формата WPP
В этом примере показано, как отслеживать буферы переменной длины данных с помощью настраиваемой строки спецификации расширенного формата WPP.
В этом примере определяется сложный тип данных (HEXDUMP), который затем можно использовать в качестве %!HEXDUMP! Строка спецификации форматирования в исходном коде.
Чтобы создать сложный тип данных HEXDUMP, добавьте следующие инструкции в файл конфигурации LocalWpp.ini:
DEFINE_CPLX_TYPE(HEXDUMP, WPP_LOGHEXDUMP, const xstr_t&, ItemHEXDump,"s", _HEX_, 0, 2);
Эта инструкция использует макрос DEFINE_CPLX_TYPE для определения сложного типа (HEXDUMP) вместе с его атрибутами, такими как тип аргумента (const xstr_t&) и количество параметров, передаваемых в TraceMessage (2). Так как этот сложный тип используется для данных переменной длины, элемент Size макроса имеет значение нулю.
Инструкция также указывает имя вспомогательного макроса (WPP_LOGHEXDUMP), который используется препроцессором WPP при разборе сложного типа HEXDUMP в исходном коде вашего поставщика трассировки .
struct xstr_t { CHAR * _buf; short _len; xstr_t(__in_ecount(len) char *buf, short len):_buf(buf),_len(len) {} };
Эта инструкция определяет структуру, которая используется для сохранения длины и адреса буфера переменной длины. Эта структура инициализируется в макросе LOG_LENSTR и является локальной для каждого вызова DoTraceMessage, где сложный тип HEXDUMP используется в параметре FormatString.
WPP_FLAGS(-DLOG_LENSTR(len,str)=xstr_t(str,len));
Эта инструкция определяет макрос, используемый для инициализации структуры xstr_t для буфера переменной длины. Этот макрос необходимо использовать, чтобы передать буфер переменной длины в параметр переменной спискаDoTraceMessage.
WPP_FLAGS(-DWPP_LOGHEXDUMP(x) WPP_LOGPAIR(2,&(x)._len) WPP_LOGPAIR((x)._len, (x)._buf));
Эта инструкция определяет вспомогательный макрос, используемый для форматирования пар длины/адреса аргумента буфера переменной длины, когда он передаётся в функцию TraceMessage.
Аргументы переменной длины требуют двух пар длины и адреса. В результате макрос WPP_LOGHEXDUMP определяет два вызова WPP_LOGPAIR следующим образом:
- Первый вызов WPP_LOGPAIR передает размер буфера переменной длины.
- Второй вызов WPP_LOGPAIR передает адрес самого буфера.
Примечание Этот макрос требует, чтобы структура xstr_t была инициализирована для буфера переменной длины вызовом LOG_LENSTR. В результате необходимо передать буфер переменной длины в DoTraceMessage через макрос LOG_LENSTR.
В Visual Studio откройте страницу свойств проекта. В разделе трассировка WPP, Параметры файла, укажите LocalWpp.ini в качестве файла дополнительной конфигурации. Более подробную информацию см. в разделе препроцессора WPP.
В следующем примере исходного кода показано, как поставщик трассировки может трассировать буфер данных с помощью %!HEXDUMP! Строка спецификации формата:
CHAR HexDump[1024] = {0, 1, 2, 3, 4, 5, 6, 7} ;
DoTraceMessage(Noise, "HEXDUMP: %!HEXDUMP! ", LOG_LENSTR(sizeof(HexDump),(PCHAR)HexDump));
Примечание Можно создать сложный тип (HEXBYTES) для трассировки буферов переменной длины. Этот сложный тип можно указать, выполнив процедуру, используемую для сложного типа HEXDUMP.