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


Разделы справки создавать настраиваемые строки спецификации расширенного формата 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:

  1. DEFINE_CPLX_TYPE(IPV6ADDR, WPP_LOGIPV6, in6_addr *, ItemIPV6Addr, "s", _IPV6_, 0, 1);

    Эта инструкция использует макрос DEFINE_CPLX_TYPE для определения сложного типа (IPV6ADDR) вместе с его атрибутами, такими как тип аргумента (in6_addr *) и размер (16).

    Инструкция также указывает имя вспомогательного макроса (WPP_LOGIPV6), который используется препроцессором WPP при анализе IPV6ADDR сложного типа в исходном коде поставщика трассировки.

  2. 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:

  1. 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 в исходном коде поставщика трассировки.

  2. 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.

  3. WPP_FLAGS(-DLOG_LENSTR(len,str)=xstr_t(str,len));

    Эта инструкция определяет макрос, используемый для инициализации структуры xstr_t для буфера переменной длины. Этот макрос необходимо использовать для передачи буфера переменной длины в параметре VariableListdoTraceMessage.

  4. 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.