У меня есть поставщики 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
user1208 13 Май 2016 в 18:59

2 ответа

Лучший ответ

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

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

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

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

0
Doug Cook - MSFT 3 Июн 2016 в 04:48

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

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

0
Alois Kraus 13 Май 2016 в 16:14