Разделы справки создавать настраиваемые строки спецификации расширенного формата WPP?
Пользовательские строки спецификации расширенного формата WPP создаются с помощью макроса DEFINE_CPLX_TYPE. Дополнительные сведения об использовании этого макроса см. в разделе Что такое синтаксис определения сложных типов?
В этом разделе приведены примеры, демонстрирующие следующее:
В каждом из этих примеров показано использование пользовательского файла конфигурации WPP для определения макроса DEFINE_CPLX_TYPE. В этих примерах файл конфигурации называется LocalWpp.ini. Дополнительные сведения об использовании пользовательских файлов конфигурации WPP см. в статье Определение пользовательских типов данных.
Трассировка строк фиксированной длины с помощью настраиваемых строк спецификации расширенного формата WPP
В этом примере показано, как отследить сетевые адреса протокола IP версии 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 , в котором в параметре FormatString используется сложный тип HEXDUMP.
WPP_FLAGS(-DLOG_LENSTR(len,str)=xstr_t(str,len));
Эта инструкция определяет макрос, используемый для инициализации структуры xstr_t для буфера переменной длины. Этот макрос необходимо использовать для передачи буфера переменной длины в параметре VariableListdoTraceMessage.
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.