Como fazer criar cadeias de caracteres de especificação de formato estendido WPP personalizadas?
Você cria cadeias de caracteres de especificação de formato estendido WPP personalizadas usando a macro DEFINE_CPLX_TYPE. Para obter mais informações sobre como usar essa macro, consulte Qual é a sintaxe da definição de tipos complexos?.
Este tópico fornece exemplos que mostram como fazer o seguinte:
Cada um desses exemplos mostra o uso de um arquivo de configuração WPP personalizado para a definição da macro DEFINE_CPLX_TYPE. Nesses exemplos, o arquivo de configuração é nomeado LocalWpp.ini. Para obter mais informações sobre como usar arquivos de configuração personalizados do WPP, consulte Como você define tipos de dados personalizados?.
Rastrear cadeias de caracteres de comprimento fixo por meio de cadeias de caracteres de especificação de formato estendido WPP personalizado
Este exemplo mostra como rastrear endereços de rede IPv6 (Protocolo de Internet versão 6) usando uma cadeia de caracteres de especificação de formato estendido WPP personalizada. Os endereços de rede IPv6, conforme definido pela estrutura de in6_addr, têm um comprimento fixo de 16 bytes.
Neste exemplo, um tipo de dados complexo (IPV6ADDR) é definido, que pode ser usado como %! IPV6ADDR! cadeia de caracteres de especificação de formato no código-fonte.
Para criar o tipo de dados complexo IPV6ADDR, adicione as seguintes instruções ao arquivo de configuração LocalWpp.ini:
DEFINE_CPLX_TYPE(IPV6ADDR, WPP_LOGIPV6, in6_addr *, ItemIPV6Addr, "s", _IPV6_, 0, 1);
Essa instrução usa a macro DEFINE_CPLX_TYPE para definir o tipo complexo (IPV6ADDR) junto com seus atributos, como seu tipo de argumento (in6_addr *) e tamanho (16).
A instrução também especifica o nome de uma macro auxiliar (WPP_LOGIPV6) que é usada pelo pré-processador WPP quando analisa um tipo complexo IPV6ADDR no código-fonte do provedor de rastreamento.
WPP_FLAGS(-DWPP_LOGIPV6(x) WPP_LOGPAIR( (16), (x)));
Esta instrução define a macro auxiliar usada para formatar o par de comprimento/endereço do argumento IPV6 quando ele é passado para a função TraceMessage .
No Visual Studio, abra a página de propriedades do projeto. Em Rastreamento do WPP, Opções de Arquivo, especifique LocalWpp.ini como o arquivo configuração adicional. Consulte Pré-processador WPP para obter mais informações.
O código-fonte de exemplo a seguir mostra como seu provedor de rastreamento pode rastrear endereços de rede IPv6 usando o %! IPV6ADDR! cadeia de caracteres de especificação de formato:
struct in6_addr IPAddressV6 = {0};
DoTraceMessage(Noise, "IN6_ADDR = %!IPV6ADDR!", &IPAddressV6);
Nota Você pode criar um tipo complexo (MACADDR) para rastrear endereços MAC (controle de acesso de mídia de comprimento fixo). Esse tipo complexo pode ser especificado seguindo o procedimento usado para o tipo complexo IPV6ADDDR.
Rastrear cadeias de caracteres de comprimento variável por meio de cadeias de caracteres de especificação de formato estendido WPP personalizado
Este exemplo mostra como rastrear buffers de dados de comprimento variável usando uma cadeia de caracteres de especificação de formato estendido WPP personalizada.
Neste exemplo, um tipo de dados complexo (HEXDUMP) é definido, que pode ser usado como %! HEXDUMP! cadeia de caracteres de especificação de formato no código-fonte.
Para criar o tipo de dados complexo HEXDUMP, adicione as seguintes instruções ao arquivo de configuração LocalWpp.ini:
DEFINE_CPLX_TYPE(HEXDUMP, WPP_LOGHEXDUMP, const xstr_t&, ItemHEXDump,"s", _HEX_, 0, 2);
Essa instrução usa a macro DEFINE_CPLX_TYPE para definir o tipo complexo (HEXDUMP) junto com seus atributos, como seu tipo de argumento (const xstr_t&) e o número de parâmetros que são passados para TraceMessage (2). Como esse tipo complexo deve ser usado para dados de comprimento variável, o elemento Size da macro é definido como zero.
A instrução também especifica o nome de uma macro auxiliar (WPP_LOGHEXDUMP) que é usada pelo pré-processador WPP quando analisa um tipo complexo HEXDUMP no código-fonte do provedor de rastreamento.
struct xstr_t { CHAR * _buf; short _len; xstr_t(__in_ecount(len) char *buf, short len):_buf(buf),_len(len) {} };
Essa instrução define uma estrutura usada para salvar o comprimento e o endereço de um buffer de comprimento variável. Essa estrutura é inicializada na macro LOG_LENSTR e é local para cada invocação de DoTraceMessage na qual o tipo complexo HEXDUMP é usado dentro do parâmetro FormatString .
WPP_FLAGS(-DLOG_LENSTR(len,str)=xstr_t(str,len));
Essa instrução define a macro usada para inicializar uma estrutura xstr_t para o buffer de comprimento variável. Você deve usar essa macro para passar o buffer de comprimento variável no parâmetro VariableList de DoTraceMessage.
WPP_FLAGS(-DWPP_LOGHEXDUMP(x) WPP_LOGPAIR(2,&(x)._len) WPP_LOGPAIR((x)._len, (x)._buf));
Essa instrução define a macro auxiliar usada para formatar os pares de comprimento/endereço do argumento buffer de comprimento variável quando ele é passado para a função TraceMessage .
Os argumentos de comprimento variável exigem dois pares de comprimento/endereço. Como resultado, a macro WPP_LOGHEXDUMP define duas chamadas para WPP_LOGPAIR da seguinte maneira:
- A primeira chamada para WPP_LOGPAIR passa o tamanho do buffer de comprimento variável.
- A segunda chamada para WPP_LOGPAIR passa o endereço do próprio buffer.
Nota Essa macro requer que uma estrutura de xstr_t tenha sido inicializada para o buffer de comprimento variável por uma chamada para LOG_LENSTR. Como resultado, você deve passar o buffer de comprimento variável para DoTraceMessage por meio da macro LOG_LENSTR.
No Visual Studio, abra a página de propriedades do projeto. Em Rastreamento do WPP, Opções de Arquivo, especifique LocalWpp.ini como o arquivo configuração adicional. Consulte Pré-processador WPP para obter mais informações.
O código-fonte de exemplo a seguir mostra como seu provedor de rastreamento pode rastrear um buffer de dados usando o %! HEXDUMP! cadeia de caracteres de especificação de formato:
CHAR HexDump[1024] = {0, 1, 2, 3, 4, 5, 6, 7} ;
DoTraceMessage(Noise, "HEXDUMP: %!HEXDUMP! ", LOG_LENSTR(sizeof(HexDump),(PCHAR)HexDump));
Nota Você pode criar um tipo complexo (HEXBYTES) para rastrear buffers de comprimento variável. Esse tipo complexo pode ser especificado seguindo o procedimento usado para o tipo complexo HEXDUMP.