Compartilhar via


Qual é a sintaxe da definição de tipos complexos?

O ETW (Rastreamento de Eventos para Windows) define vários tipos simples e complexos para uso nas funções de rastreamento. Esses tipos são declarados no arquivo Defaultwpp.ini. No entanto, você pode criar seu próprio arquivo de configuração personalizado e direcionar o WPP para usá-lo.

O formato do tipo de dados complexo, DEFINE_CPLX_TYPE, é o seguinte:

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

Por exemplo:

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

Formatar elementos

Typename
O WPP usa esse campo para identificar o tipo complexo. Por exemplo, .*ls.

HelperMacroName
Uma macro auxiliar que converte um argumento em uma matriz de comprimento variável no formato de um par de comprimento/endereço. Esse formato é exigido pela função TraceMessage para cada uma das entradas em sua lista de argumentos variáveis.

Para formatar o argumento corretamente, você deve usar a macro WPP_LOGPAIR na definição da macro auxiliar, conforme mostrado no exemplo a seguir:

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

Nota Dependendo da lógica de rastreamento que você deseja implementar, talvez seja necessário definir a macro usando várias macros WPP_LOGPAIR.

Tipo de argumento
Indica o valor que os argumentos do tipo TypeName podem aceitar. Por exemplo, const xwcs_t&.

WppMofType
Especifica um tipo MOF (Managed Object Format) reconhecido pelo pré-processador WPP

WppMofFormat
Especifica um especificador de formato, como "s", que é reconhecido pelo pré-processador WPP.

TypeSignature
Uma cadeia de caracteres acrescentada ao nome da função para associá-la ao tipo complexo. Deve haver um único caractere ou vários caracteres entre sublinhados. Por exemplo, _xwcs_t_.

Prioridade
Esse elemento é reservado e deve ser definido como zero.

Slots
Especifica o número máximo de parâmetros de comprimento variável que o pré-processador WPP passa para a função TraceMessage para esse tipo complexo. Esse elemento de formato é opcional. O WPP usará um valor padrão de 1 se esse elemento não for especificado.

Exemplo

Para definir um tipo complexo, faça o seguinte:

  1. Crie um arquivo de configuração local. Esse arquivo deve conter a macro DEFINE_CPLX_TYPE que define o tipo complexo.

  2. Especifique o arquivo de configuração local para o pré-processador WPP. Abra as propriedades do projeto. Em Rastreamento do WPP, Opções de Arquivo, use o campo Arquivo de Configuração Adicional para especificar o nome do arquivo de configuração (parâmetro -ini ). Certifique-se de habilitar o rastreamento do WPP definindo Executar WPP como Sim. Consulte Pré-processador WPP para obter mais informações.

Por exemplo, você pode criar um arquivo de configuração local (Localwpp.ini) que define um tipo complexo chamado .*ls. Você define o tipo complexo da seguinte maneira:

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

Em seguida, quando o WPP vê um tipo .*ls, como em:

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

O WPP gera a seguinte função de preparo (em que o SF representa a "função de preparo"):

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

Em seguida, o WPP gera uma entrada MOF, como na cadeia de caracteres a seguir, em que o nome do tipo .*ls é substituído pelo formato MOF apropriado, %s.

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

Ele também gera uma estrutura para o tipo, como

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

Agora, adicione uma macro para combinar os tipos de dados em uma cadeia de caracteres do tipo xwstr_t, da seguinte maneira:

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

em que ItemPWString é um tipo de cadeia de caracteres Unicode contado reconhecido pelo WPP. O comprimento é especificado como 2 bytes.

Quando o ETW interpreta a definição de WPP_LOGXWCS, ele coloca uma cadeia de caracteres de 2 bytes em um buffer WPP_LOGPAIR primeira macro é interpretada. O ETW copia todos os bytes da cadeia de caracteres em um buffer quando o ETW interpreta a segunda macro WPP_LOGPAIR,

Como você especificou o comprimento separado dos dados, WPP_LOGXWCS consome dois slots de TraceMessage. Portanto, o número 2 é o oitavo argumento.

Ao chamar o Pré-processador WPP, use a opção Ignorar Pontos de Exclamação (-noshrieks). Isso ajuda o WPP a reconhecer um tipo complexo que tem um nome que não está entre pontos de exclamação (!), também conhecido como "gritos".

Para obter uma lista completa das opções de rastreamento do WPP e informações sobre como defini-las na página de propriedades do projeto, consulte Pré-processador WPP.