Função EventWriteString (evntprov.h)
Grava um evento ETW que contém uma cadeia de caracteres como seus dados. Essa função não deve ser usada.
Sintaxe
ULONG EVNTAPI EventWriteString(
[in] REGHANDLE RegHandle,
[in] UCHAR Level,
[in] ULONGLONG Keyword,
[in] PCWSTR String
);
Parâmetros
[in] RegHandle
Identificador de registro do provedor. O identificador vem de EventRegister. O evento gerado usará a ProviderId associada ao identificador.
[in] Level
Um número de 8 bits usado para descrever a gravidade ou a importância de um evento.
Importante
ProviderId, Level e Keyword são os principais meios para filtrar eventos. Outros tipos de filtragem são possíveis, mas têm uma sobrecarga muito maior. Sempre atribua um nível diferente de zero e palavra-chave a cada evento.
Consulte EVENT_DESCRIPTOR para obter detalhes sobre o nível de evento.
[in] Keyword
Uma máscara de bits de 64 bits usada para indicar a associação de um evento em um conjunto de categorias de eventos.
Importante
ProviderId, Level e Keyword são os principais meios para filtrar eventos. Outros tipos de filtragem são possíveis, mas têm uma sobrecarga muito maior. Sempre atribua um nível diferente de zero e palavra-chave a cada evento.
Consulte EVENT_DESCRIPTOR para obter detalhes sobre a palavra-chave do evento.
[in] String
Cadeia de caracteres terminada em NUL para gravar como os dados do evento.
Valor retornado
Retorna ERROR_SUCCESS se tiver êxito ou um código de erro. Os códigos de erro possíveis incluem o seguinte:
- ERROR_INVALID_PARAMETER: um ou mais dos parâmetros não são válidos.
- ERROR_INVALID_HANDLE: o identificador de registro do provedor não é válido.
- ERROR_ARITHMETIC_OVERFLOW: o tamanho do evento é maior que o máximo permitido (64 KB – cabeçalho).
- ERROR_MORE_DATA: o tamanho do buffer de sessão é muito pequeno para o evento.
- ERROR_NOT_ENOUGH_MEMORY: ocorre quando os buffers preenchidos estão tentando liberar para o disco, mas os IOs de disco não estão acontecendo rápido o suficiente. Isso acontece quando o disco está lento e o tráfego de eventos é pesado. Eventualmente, não há mais buffers gratuitos (vazios) e o evento é descartado.
- STATUS_LOG_FILE_FULL: o arquivo de reprodução em tempo real está cheio. Os eventos não são registrados na sessão até que um consumidor em tempo real consuma os eventos do arquivo de reprodução.
O código de erro destina-se principalmente ao uso em cenários de depuração e diagnóstico. A maioria dos códigos de produção deve continuar a ser executada e continuar a relatar eventos mesmo que um evento ETW não possa ser gravado, portanto, os builds de versão geralmente devem ignorar o código de erro.
Comentários
Essa API não é útil e não deve ser usada.
- A maioria das ferramentas de análise do ETW não dá suporte corretamente a eventos somente cadeia de caracteres sem um manifesto.
- Sem um manifesto, informações importantes sobre o evento (por exemplo, o nome do provedor, a ID do evento e o nome do evento) não estão disponíveis para que os eventos resultantes sejam difíceis de usar mesmo quando a ferramenta de análise dá suporte a eventos somente cadeia de caracteres.
- Com um manifesto, essa função se comporta quase exatamente como o código de um evento baseado em manifesto com um único campo de cadeia de caracteres. No entanto, o evento baseado em manifesto é mais compatível com as ferramentas de análise de rastreamento. Além disso, o código gerado por MC.exe para um evento com um único campo de cadeia de caracteres é mais eficiente do que a função EventWriteString .
Em vez de usar essa API, considere as seguintes alternativas:
- Use TraceLoggingProvider.h para gravar eventos que são bem compatíveis com as ferramentas de análise do ETW, funcionam sem um manifesto e incluem metadados como nome do provedor e nome do evento.
- Escreva um manifesto de instrumentação. Crie um evento simples com um único valor de cadeia de caracteres terminada em NUL. Você pode escrever e coletar eventos mesmo sem um manifesto. Você só precisará do manifesto para decodificar o rastreamento coletado.
EventWriteString grava um evento com uma carga de dados que consiste na cadeia de caracteres especificada. Essa API é quase equivalente ao seguinte código:
EVENT_DESCRIPTOR eventDescriptor;
EVENT_DATA_DESCRIPTOR dataDescriptor;
EventDescCreate(&eventDescriptor, 0, 0, 0, Level, 0, 0, Keyword);
EventDataDescCreate(&dataDescriptor, String, (wcslen(String) + 1) * sizeof(WCHAR));
return EventWrite(RegHandle, &eventDescriptor, 1, &dataDescriptor);
O evento resultante é o mesmo que qualquer outro evento gerado pelo EventWrite , exceto que o evento resultante tem o sinalizador EVENT_HEADER_FLAG_STRING_ONLY definido (consulte EVENT_HEADER para obter informações sobre sinalizadores de evento).
Observe que o evento é gravado com ID, Versão, Opcode, Tarefa e Canal definidos como 0.
Observe que o evento usa a ID de atividade do thread atual.
As ferramentas de análise do ETW que estão cientes do sinalizador EVENT_HEADER_FLAG_STRING_ONLY podem extrair o valor da cadeia de caracteres mesmo quando o decodificador não consegue localizar nenhuma outra informação de decodificação para o provedor de eventos. No entanto, sem um manifesto, as ferramentas não poderão determinar o nome do provedor do evento.
Requisitos
Cliente mínimo com suporte | Windows Vista [aplicativos da área de trabalho | Aplicativos UWP] |
Servidor mínimo com suporte | Windows Server 2008 [aplicativos da área de trabalho | Aplicativos UWP] |
Plataforma de Destino | Windows |
Cabeçalho | evntprov.h |
Biblioteca | Advapi32.lib |
DLL | Advapi32.dll |