Compartir a través de


¿Cuál es la sintaxis de la definición de tipos complejos?

Seguimiento de eventos para Windows (ETW) define varios tipos sencillos y complejos para su uso en las funciones de seguimiento. Estos tipos se declaran en el archivo Defaultwpp.ini. Sin embargo, puede crear su propio archivo de configuración personalizado y dirigir WPP para usarlo.

El formato del tipo de datos complejo, DEFINE_CPLX_TYPE, es el siguiente:

DEFINE_CPLX_TYPE(TypeName, HelperMacroName, ArgumentType, WppMofType,"WppMofFormat", TypeSignature, Priority, Slots);

Por ejemplo:

DEFINE_CPLX_TYPE(.*ls, WPP_LOGXWCS, const xwcs_t&, ItemPWString,"s", _xwcs_t_, 0, 2);

Formatear elementos

Typename
WPP usa este campo para identificar el tipo complejo. Por ejemplo, .*ls.

HelperMacroName
Macro auxiliar que convierte un argumento en una matriz de longitud variable con el formato de un par de longitud y dirección. La función TraceMessage requiere este formato para cada una de las entradas de su lista de argumentos de variable.

Para dar formato al argumento correctamente, debe usar la macro WPP_LOGPAIR en la definición de la macro auxiliar, como se muestra en el ejemplo siguiente:

#define HelperMacroName(x) WPP_LOGPAIR(length, x)

Nota En función de la lógica de seguimiento que quiera implementar, es posible que tenga que definir la macro mediante varias macros de WPP_LOGPAIR.

Tipo de argumento
Indica el valor que pueden aceptar los argumentos del tipo TypeName . Por ejemplo, const xwcs_t&.

WppMofType
Especifica un tipo de formato de objeto administrado (MOF) reconocido por el preprocesador de WPP.

WppMofFormat
Especifica un especificador de formato, como "s", que reconoce el preprocesador de WPP.

TypeSignature
Cadena anexada al nombre de la función para asociarla al tipo complejo. Debe haber un solo carácter o varios caracteres entre caracteres de subrayado. Por ejemplo, _xwcs_t_.

Prioridad
Este elemento está reservado y debe establecerse en cero.

Ranuras
Especifica el número máximo de parámetros de longitud variable que el preprocesador de WPP pasa a la función TraceMessage para este tipo complejo. Este elemento de formato es opcional. WPP usa un valor predeterminado de 1 si no se especifica este elemento.

Ejemplo

Para definir un tipo complejo, haga lo siguiente:

  1. Cree un archivo de configuración local. Este archivo debe contener la macro DEFINE_CPLX_TYPE que define el tipo complejo.

  2. Especifique el archivo de configuración local en el preprocesador de WPP. Abra las propiedades del proyecto. En Seguimiento de WPP, Opciones de archivo, use el campo Archivo de configuración adicional para especificar el nombre del archivo de configuración (parámetro-ini ). Asegúrese de habilitar el seguimiento de WPP estableciendo Ejecutar WPP en . Consulte Preprocesador de WPP para obtener más información.

Por ejemplo, puede crear un archivo de configuración local (Localwpp.ini) que defina un tipo complejo denominado .*ls. Defina el tipo complejo de la siguiente manera:

DEFINE_CPLX_TYPE(.*ls, WPP_LOGXWCS, const xwcs_t&, ItemPWString,"s", _xwcs_t_, 0, 2);

Después, cuando WPP ve un tipo .*ls, como en:

printf("my string is %.*ls", value);

WPP genera la siguiente función de almacenamiento provisional (donde SF representa "función de ensayo"):

WPP_SF__xwcs_t_(..., const xwcs_t& a1) {
    TraceMessage(..., WPP_LOGXWCS(a1) 0);
}

A continuación, WPP genera una entrada MOF, como en la siguiente cadena, donde el nombre de tipo .*ls se reemplaza por el formato MOF adecuado, %s.

"my string is %s"
{
    Value, ItemPWString
}

También genera una estructura para el tipo, como

struct xwcs_t {
      WCHAR*    _buf;
      short     _len;
      xwcs_t(short buf, short len):_buf(buf),_len(len){}
};

Ahora, agregue una macro para combinar los tipos de datos en una cadena de tipo xwstr_t, como se indica a continuación:

#define WPP_LOGXWCS(x) WPP_LOGPAIR(2, &(x)._len) WPP_LOGPAIR((x)._len, (x)._buf)

donde ItemPWString es un tipo de cadena Unicode contado reconocido por WPP. La longitud se especifica como 2 bytes.

Cuando ETW interpreta la definición de WPP_LOGXWCS, coloca una cadena de 2 bytes en un búfer, se interpreta la primera macro de WPP_LOGPAIR . A continuación, ETW copia todos los bytes de la cadena en un búfer cuando ETW interpreta la segunda macro de WPP_LOGPAIR,

Dado que especificó la longitud independiente de los datos, WPP_LOGXWCS consume dos ranuras de TraceMessage. Por lo tanto, el número 2 es el octavo argumento.

Al llamar al preprocesador de WPP, use la opción Omitir marcas de exclamación (-noshrieks). Esto ayuda a WPP a reconocer un tipo complejo que tiene un nombre que no está entre signos de exclamación (!), también conocido como "eshrieks".

Para obtener una lista completa de las opciones de seguimiento de WPP e información sobre cómo establecerlas desde la página de propiedades del proyecto, vea Preprocesador de WPP.