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


Как создать настраиваемые строки спецификации расширенного формата WPP?

Вы создаете настраиваемые строки спецификации расширенного формата WPP с помощью макроса DEFINE_CPLX_TYPE. Дополнительные сведения об использовании этого макроса см. в разделе Что такое синтаксис определения сложных типов?.

В этом разделе приведены примеры, показывающие, как выполнить следующие действия.

В каждом из этих примеров показано использование пользовательского файла конфигурации WPP для определения макроса DEFINE_CPLX_TYPE. В этих примерах файл конфигурации называется LocalWpp.ini. Дополнительные сведения об использовании пользовательских файлов конфигурации WPP см. в статье Как определить пользовательские типы данных?.

Трассировка строк фиксированной длины с помощью настраиваемых строк спецификации расширенного формата WPP

В этом примере показано, как трассировать сетевые адреса протокола Интернета версии 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, где сложный тип HEXDUMP используется в параметре FormatString.

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

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

  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.