Condividi tramite


Qual è la sintassi della definizione di tipi complessi?

Event Tracing for Windows (ETW) definisce diversi tipi semplici e complessi da usare nelle funzioni di traccia. Questi tipi vengono dichiarati nel file Defaultwpp.ini. Tuttavia, è possibile creare un file di configurazione personalizzato e indirizzare WPP per usarlo.

Il formato del tipo di dati complesso, DEFINE_CPLX_TYPE, è il seguente:

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

Ad esempio:

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

Formatta elementi

Typename
WPP usa questo campo per identificare il tipo complesso. Ad esempio, .*ls.

HelperMacroName
Macro helper che converte un argomento in una matrice a lunghezza variabile nel formato di una coppia di lunghezza/indirizzo. Questo formato è richiesto dalla funzione TraceMessage per ognuna delle voci nell'elenco di argomenti variabile.

Per formattare correttamente l'argomento, è necessario utilizzare la macro WPP_LOGPAIR nella definizione della macro helper, come illustrato nell'esempio seguente:

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

Nota A seconda della logica di traccia che si vuole implementare, potrebbe essere necessario definire la macro usando più macro WPP_LOGPAIR.

Tipo di argomento
Indica il valore che gli argomenti del tipo TypeName possono accettare. Ad esempio, const xwcs_t&.

WppMofType
Specifica un tipo MOF (Managed Object Format) riconosciuto dal preprocessore WPP

WppMofFormat
Specifica un identificatore di formato, ad esempio "s", riconosciuto dal preprocessore WPP.

TypeSignature
Stringa aggiunta al nome della funzione per associarla al tipo complesso. Deve essere presente un singolo carattere o più caratteri tra caratteri di sottolineatura. Ad esempio, _xwcs_t_.

Priorità
Questo elemento è riservato e deve essere impostato su zero.

Slot
Specifica il numero massimo di parametri a lunghezza variabile passati dal preprocessore WPP alla funzione TraceMessage per questo tipo complesso. Questo elemento di formato è facoltativo. WPP usa un valore predefinito pari a 1 se questo elemento non è specificato.

Esempio

Per definire un tipo complesso, eseguire le operazioni seguenti:

  1. Creare un file di configurazione locale. Questo file deve contenere la macro DEFINE_CPLX_TYPE che definisce il tipo complesso.

  2. Specificare il file di configurazione locale per il preprocessore WPP. Aprire le proprietà del progetto. In Traccia WPP, Opzioni file usare il campo File di configurazione aggiuntivo per specificare il nome del file di configurazione (parametro-ini ). Assicurarsi di abilitare la traccia WPP impostando Esegui WPP su . Per altre informazioni, vedere Il preprocessore WPP.

Ad esempio, è possibile creare un file di configurazione locale (Localwpp.ini) che definisce un tipo complesso denominato .*ls. Il tipo complesso viene definito nel modo seguente:

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

Quindi, quando WPP vede un tipo .*ls, ad esempio in:

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

WPP genera la funzione di staging seguente (dove SF rappresenta la "funzione di staging"):

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

WPP genera quindi una voce MOF, ad esempio nella stringa seguente, in cui il nome del tipo .*ls viene sostituito con il formato MOF appropriato, %s.

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

Genera anche una struttura per il tipo, ad esempio

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

Aggiungere ora una macro per combinare i tipi di dati in una stringa di tipo xwstr_t, come indicato di seguito:

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

dove ItemPWString è un tipo di stringa Unicode con conteggio riconosciuto da WPP. La lunghezza viene specificata come 2 byte.

Quando ETW interpreta la definizione di WPP_LOGXWCS, inserisce una stringa a 2 byte in un buffer la prima macro WPP_LOGPAIR viene interpretata. ETW copia quindi tutti i byte della stringa in un buffer quando ETW interpreta la seconda macro WPP_LOGPAIR,

Poiché è stata specificata la lunghezza separata dai dati, WPP_LOGXWCS utilizza due slot di TraceMessage. Pertanto, il numero 2 è l'ottavo argomento.

Quando si chiama il preprocessore WPP, usare l'opzione Ignora segni esclamativi (-noshrieks). Ciò consente a WPP di riconoscere un tipo complesso con un nome che non è racchiuso tra i punti esclamativi (!), noto anche come "shrieks".

Per un elenco completo delle opzioni di traccia WPP e informazioni su come impostarle dalla pagina delle proprietà del progetto, vedere Preprocessore WPP.