Cómo crear cadenas personalizadas de especificación de formato extendido de WPP?
Puede crear cadenas personalizadas de especificación de formato extendido de WPP mediante la macro DEFINE_CPLX_TYPE. Para obtener más información sobre cómo usar esta macro, vea ¿Cuál es la sintaxis de la definición de tipos complejos?.
En este tema se proporcionan ejemplos que muestran cómo hacer lo siguiente:
Cada uno de estos ejemplos muestra el uso de un archivo de configuración de WPP personalizado para la definición de la macro DEFINE_CPLX_TYPE. En estos ejemplos, el archivo de configuración se denomina LocalWpp.ini. Para obtener más información sobre cómo usar archivos de configuración de WPP personalizados, vea ¿Cómo se definen los tipos de datos personalizados?.
Seguimiento de cadenas de longitud fija a través de cadenas personalizadas de especificación de formato extendido de WPP
En este ejemplo se muestra cómo realizar un seguimiento de las direcciones de red del Protocolo de Internet versión 6 (IPv6) mediante una cadena de especificación de formato extendido de WPP personalizada. Las direcciones de red IPv6, definidas por la estructura in6_addr, tienen una longitud fija de 16 bytes.
En este ejemplo, se define un tipo de datos complejo (IPV6ADDR), que se puede usar como %! IPV6ADDR! cadena de especificación de formato en el código fuente.
Para crear el IPV6ADDR tipo de datos complejo, agregue las siguientes instrucciones al archivo de configuración LocalWpp.ini:
DEFINE_CPLX_TYPE(IPV6ADDR, WPP_LOGIPV6, in6_addr *, ItemIPV6Addr, "s", _IPV6_, 0, 1);
Esta instrucción usa la macro DEFINE_CPLX_TYPE para definir el tipo complejo (IPV6ADDR) junto con sus atributos, como su tipo de argumento (in6_addr *) y el tamaño (16).
La instrucción también especifica el nombre de una macro auxiliar (WPP_LOGIPV6) que usa el preprocesador de WPP cuando analiza un tipo complejo IPV6ADDR en el código fuente del proveedor de seguimiento.
WPP_FLAGS(-DWPP_LOGIPV6(x) WPP_LOGPAIR( (16), (x)));
Esta instrucción define la macro auxiliar que se usa para dar formato al par de longitud y dirección del argumento IPV6 cuando se pasa a la función TraceMessage .
En Visual Studio, abra la página de propiedades del proyecto. En Seguimiento de WPP, Opciones de archivo, especifique LocalWpp.ini como archivo de configuración adicional. Consulte Preprocesador de WPP para obtener más información.
En el siguiente código fuente de ejemplo se muestra cómo el proveedor de seguimiento puede realizar un seguimiento de las direcciones de red IPv6 mediante %! IPV6ADDR! cadena de especificación de formato:
struct in6_addr IPAddressV6 = {0};
DoTraceMessage(Noise, "IN6_ADDR = %!IPV6ADDR!", &IPAddressV6);
Nota Puede crear un tipo complejo (MACADDR) para realizar el seguimiento de direcciones de control de acceso de medios de longitud fija (MAC). Este tipo complejo se puede especificar siguiendo el procedimiento que se usó para el tipo complejo IPV6ADDDR.
Seguimiento de cadenas de longitud variable a través de cadenas personalizadas de especificación de formato extendido de WPP
En este ejemplo se muestra cómo realizar un seguimiento de los búferes de datos de longitud variable mediante una cadena de especificación de formato extendido de WPP personalizada.
En este ejemplo, se define un tipo de datos complejo (HEXDUMP) que luego se puede usar como %! HEXDUMP! cadena de especificación de formato en el código fuente.
Para crear el tipo de datos complejo HEXDUMP, agregue las siguientes instrucciones al archivo de configuración LocalWpp.ini:
DEFINE_CPLX_TYPE(HEXDUMP, WPP_LOGHEXDUMP, const xstr_t&, ItemHEXDump,"s", _HEX_, 0, 2);
Esta instrucción usa la macro DEFINE_CPLX_TYPE para definir el tipo complejo (HEXDUMP) junto con sus atributos, como su tipo de argumento (const xstr_t&) y el número de parámetros que se pasan a TraceMessage (2). Dado que este tipo complejo se va a usar para los datos de longitud variable, el elemento Size de la macro se establece en cero.
La instrucción también especifica el nombre de una macro auxiliar (WPP_LOGHEXDUMP) que usa el preprocesador de WPP cuando analiza un tipo complejo HEXDUMP en el código fuente del proveedor de seguimiento.
struct xstr_t { CHAR * _buf; short _len; xstr_t(__in_ecount(len) char *buf, short len):_buf(buf),_len(len) {} };
Esta instrucción define una estructura que se usa para guardar la longitud y la dirección de un búfer de longitud variable. Esta estructura se inicializa en la macro LOG_LENSTR y es local para cada invocación de DoTraceMessage en la que se usa el tipo complejo HEXDUMP dentro del parámetro FormatString .
WPP_FLAGS(-DLOG_LENSTR(len,str)=xstr_t(str,len));
Esta instrucción define la macro que se usa para inicializar una estructura de xstr_t para el búfer de longitud variable. Debe usar esta macro para pasar el búfer de longitud variable en el parámetro VariableList de DoTraceMessage.
WPP_FLAGS(-DWPP_LOGHEXDUMP(x) WPP_LOGPAIR(2,&(x)._len) WPP_LOGPAIR((x)._len, (x)._buf));
Esta instrucción define la macro auxiliar que se usa para dar formato a los pares de longitud y dirección del argumento de búfer de longitud variable cuando se pasa a la función TraceMessage .
Los argumentos de longitud variable requieren dos pares de longitud/dirección. Como resultado, la macro WPP_LOGHEXDUMP define dos llamadas a WPP_LOGPAIR de la siguiente manera:
- La primera llamada a WPP_LOGPAIR pasa el tamaño del búfer de longitud variable.
- La segunda llamada a WPP_LOGPAIR pasa la dirección del propio búfer.
Nota Esta macro requiere que se haya inicializado una estructura de xstr_t para el búfer de longitud variable mediante una llamada a LOG_LENSTR. Como resultado, debe pasar el búfer de longitud variable a DoTraceMessage a través de la macro LOG_LENSTR.
En Visual Studio, abra la página de propiedades del proyecto. En Seguimiento de WPP, Opciones de archivo, especifique LocalWpp.ini como archivo de configuración adicional. Consulte Preprocesador de WPP para obtener más información.
En el código fuente de ejemplo siguiente se muestra cómo el proveedor de seguimiento puede realizar un seguimiento de un búfer de datos mediante %! HEXDUMP! cadena de especificación de formato:
CHAR HexDump[1024] = {0, 1, 2, 3, 4, 5, 6, 7} ;
DoTraceMessage(Noise, "HEXDUMP: %!HEXDUMP! ", LOG_LENSTR(sizeof(HexDump),(PCHAR)HexDump));
Nota Puede crear un tipo complejo (HEXBYTES) para realizar el seguimiento de búferes de longitud variable. Este tipo complejo se puede especificar siguiendo el procedimiento que se usó para el tipo complejo HEXDUMP.