ETW C ++ провайдер и C # провайдер

У меня есть провайдеры ETW на основе манифеста, написанные на C ++ и C #. Оба провайдера используют один и тот же манифест (генерируется Microsoft.Diagnostics.Tracing.TraceEvent пакет из кода C #). Канал отлажен.
Публикация событий успешна (возвращаемое значение равно 0) в обоих провайдерах, и я вижу их в perfview.

Если манифест не установлен, события поставщика C ++ отображаются в perfview с GUID провайдера, идентификатором события и т. д. Нет такого «строкового» свойства, как имя провайдера, имя события.
Но события провайдера C # имеют эти свойства.
Почему C # провайдер может это сделать? В EventSource.cs есть SendManifest метод и дополнительные ManifestData Событие регистрируется только когда я использую C # провайдера. Это причина? Если так, может ли поставщик C ++ добиться такого поведения?

редактировать
Я знаю, как установить манифест с wevtutil.exe или eventregister.exe. После некоторых исследований я обнаружил, что мне необходимо реализовать событие самоописания в C ++.

2

Решение

Windows 10 SDK включает поддержку новой системы ETW, которая вообще не требует манифеста. Вы можете использовать заголовок TraceLoggingProvider.h для генерации этих событий. Эта новая система также поддерживается в .NET 4.6 или более поздней версии в EventSource, если вы используете метод eventSource.Write или если вы установили флаг без манифеста. (Существует также пакет EventSource NuGet, если вы хотите использовать новые функции, но не хотите делать .NET 4.6 обязательным условием для вашей программы.)

Обратите внимание: хотя для этой технологии требуется новый SDK, а для определения нового формата файла журнала вам потребуются новые инструменты декодера, эта технология работает с программами, работающими в Vista или более поздних версиях. Другими словами, вам нужно использовать Windows 10 SDK, чтобы получить новый заголовок TraceLoggingProvider.h, но результирующая программа будет работать нормально в Vista или новее, если вы установите для макроса WINVER правильное значение для ОС, которую вы используете. хочу нацелиться.

Главное преимущество в том, что манифест не нужен. Основным недостатком является то, что ваши файлы журналов будут немного больше (поскольку каждое событие должно включать в себя немного информации о том, как декодировать себя).

Другой ответ также является правильным и действительным, если вы хотите использовать ETW на основе манифеста. Единственная официально поддерживаемая система для событий на основе манифеста — это регистрация манифеста. Система, которую использует EventSource (где он генерирует копию манифеста в ETW), недостаточно документирована, не поддерживается всеми инструментами декодирования ETW, и я не уверен, что вам это поможет сам. Если вы просто заинтересованы в сборе и декодировании файлов журналов, вам нужно всего лишь зарегистрировать манифест на машине, на которой вы будете выполнять декодирование (манифест используется только для слияния и декодирования — он не нужен, когда журнал фиксируется).

0

Другие решения

Насколько я знаю, TraceEvent испускает манифест во время анализа потока ETL, который затем может быть декодирован WPA. Затем WPA может отобразить строковое имя. Если вы разрешите запускать как C #, так и C ++ провайдера, вы должны увидеть одного провайдера ETW с именем. Лично я обошел это, создав манифест от моего провайдера C # ETW, а затем зарегистрировал его в своей системе с помощью wevtutil. Тогда я всегда получаю имя, но для этого мне нужны права администратора.

Увидеть
http://etwcontroler.codeplex.com/SourceControl/latest#ETWControler/ETW/HookEvents.cs

0

По вопросам рекламы [email protected]