如何创建自定义的 WPP 扩展格式规范字符串?

使用 DEFINE_CPLX_TYPE 宏创建自定义 WPP 扩展格式规范字符串。 有关如何使用此宏的详细信息,请参阅 复杂类型定义的语法是什么?

本主题提供了演示如何执行以下操作的示例:

其中每个示例都演示了对 DEFINE_CPLX_TYPE 宏的定义使用自定义 WPP 配置文件。 在这些示例中,配置文件名为 LocalWpp.ini。 有关如何使用自定义 WPP 配置文件的详细信息,请参阅 如何定义自定义数据类型?

通过自定义 WPP 扩展格式规范字符串跟踪固定长度字符串

此示例演示如何使用自定义 WPP 扩展格式规范字符串跟踪 Internet 协议版本 6 (IPv6) 网络地址。 in6_addr 结构定义的 IPv6 网络地址的固定长度为 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 预处理器在分析 跟踪提供程序源代码中的IPV6ADDR复杂类型时使用的帮助程序宏 (WPP_LOGIPV6) 的名称。

  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 预处理器在分析 跟踪提供程序源代码中的 HEXDUMP 复杂类型时使用的帮助程序宏 (WPP_LOGHEXDUMP) 的名称。

  2. struct xstr_t {
       CHAR * _buf;
       short _len;
       xstr_t(__in_ecount(len) char *buf, short len):_buf(buf),_len(len) {}
    };

    此语句定义用于保存可变长度缓冲区的长度和地址的结构。 此结构在 LOG_LENSTR 宏中初始化,并且对于在 FormatString 参数中使用 HEXDUMP 复杂类型的 DoTraceMessage 的每个调用都是本地结构。

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

    此语句定义用于初始化可变长度缓冲区xstr_t结构的宏。 必须使用此宏传递 DoTraceMessageVariableList 参数中的可变长度缓冲区。

  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传递缓冲区本身的地址。

    注意 此宏要求通过调用 LOG_LENSTR 为可变长度缓冲区初始化xstr_t结构。 因此,必须通过LOG_LENSTR宏将可变长度缓冲区传递到 DoTraceMessage

在 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 复杂类型的过程指定此复杂类型。