Почему мой пользовательский EventSource работает в Windows 8.1 и не работает в Windows Server 2012 R2?

Я создал собственный источник событий с помощью Visual Studio 2015 и пакета nuget Microsoft Event Source. Библиотека (последняя версия 1.1.28).

Я установил манифест с помощью wevtutil.exe на моей рабочей станции с Windows 8.1 и на Windows Server 2012 R2.

В общем, этот EventSource работает на обеих машинах, он извлекает события, которые видны в средстве просмотра событий. Просто на Windows Server 2012 R2 вывод в средстве просмотра событий выглядит немного паршиво.

Когда я устанавливаю его на свою рабочую станцию, он работает нормально. Вот пример моего примера события UnhandledException:

введите здесь описание изображения

Когда я устанавливаю его на Windows Server 2012 R2, средство просмотра событий полностью перепуталось, как вы можете видеть на этом снимке экрана:

введите здесь описание изображения

Кто-нибудь знает, почему это происходит? Как я могу это исправить?

Изменить:

Я могу воспроизвести его с помощью примеров библиотеки Microsoft EventSource выполнив следующие действия:

  1. Создайте новый проект консольного приложения в Visual Studio и назовите его «DemoEventSource».
  2. Установите примеры библиотеки Microsoft EventSource из nuget.
  3. Запустите EventLogEventSourceDemo. Вы можете закомментировать все остальные примеры в "EventSourceSamples\00_AllSamples.cs", поскольку они не имеют отношения к этой проблемевведите здесь описание изображения
  4. Нажмите F5, чтобы запустить его, и следуйте инструкциям, программа просмотра событий откроется автоматически. На моей рабочей станции все работает нормально: введите здесь описание изображения
  5. На следующем этапе я создал виртуальную машину в Azure с Windows Server 12 (проблема возникает в Windows Server 2012 R2 и Windows Server 2012) и развернул на ней тестовое приложение. Результат испорчен, как описано в моем примере выше: введите здесь описание изображения

person Philipp Stauss    schedule 29.06.2016    source источник
comment
Филипп, Начнем с простого. EventViewer не поддерживает (по крайней мере, в более ранних версиях Windows) встроенные манифесты, созданные EventSource. Вместо этого он использует определенный манифест, который необходимо установить на машину, на которой работает EventViewer. Вы сделали этот шаг? Да или сейчас как бы разделяет остальную часть разговора. Спасибо, что поймали меня на Твиттере. Я не провожу здесь много времени, но я отметил эту тему. Кэтлин   -  person Kathleen Dollard    schedule 05.07.2016
comment
Привет Кэтлин. Я обновил детали вопроса. Я установил манифест в обоих сценариях, на компьютере с Windows 8.1 и на компьютере с Windows Server 2012 R2. Просто на Windows Server это выглядит очень странно. Я пробовал несколько экземпляров Windows Server. Всегда один и тот же результат.   -  person Philipp Stauss    schedule 06.07.2016


Ответы (1)


Без тщательного тестирования я не могу сказать со 100% уверенностью, но это похоже на ошибку. EventSource делает некоторые необычные (но законные) вещи с ключевыми словами. Например, в манифесте говорится, что «событие с идентификатором 72 использует ключевое слово 0x12», но когда вы на самом деле просматриваете файл ETL, событие фактически использует ключевое слово 0xf000012 (или что-то в этом роде). Такое поведение является законным, но встречается редко. В некоторых версиях tdh.dll это приводило к неправильному декодированию события. Журнал событий использует tdh.dll для декодирования событий.

IIRC, в Windows 8.1 есть исправление для этой ошибки, но я не думаю, что исправление попало в более ранние версии.

person Doug Cook - MSFT    schedule 12.07.2016
comment
какое исправление? 8.1 и 2012 R2 — это одна и та же версия, поэтому исправление можно применить к обоим. - person magicandre1981; 13.07.2016
comment
это исправление? support.microsoft.com/en-us/kb/3080149, который исправляет это. : Устранена случайная проблема с декодированием событий в функции TdhGetEventInformation вспомогательной функции трассировки данных (TDH), которая вызывала события трассировки событий для Windows (ETW), созданные с помощью .NET Framework 4.6 - person magicandre1981; 13.07.2016
comment
Я думаю, что KB3080149 исправляет что-то еще. Это исправление уже было установлено на моей виртуальной машине Azure, когда я начал тестировать свой EventSource. - person Philipp Stauss; 13.07.2016
comment
Даг, ты понял, что это за исправление? - person magicandre1981; 19.07.2016
comment
Я не специалист по просмотру статей базы знаний. Я знаю, что это было обнаружено и исправлено во время разработки Windows 10. Я не вижу никакого соответствующего исправления, перенесенного в 8.1, поэтому, возможно, оно не было перенесено. - person Doug Cook - MSFT; 04.08.2016
comment
В tdh.dll была еще одна проблема, связанная с тем, как TDH кэширует метаданные декодированных событий. Я подозреваю, что это было исправление в KB3080149. - person Doug Cook - MSFT; 04.08.2016
comment
Ok. Означает ли это, что решения этой проблемы не будет? - person Philipp Stauss; 08.08.2016
comment
Я не знаю никаких текущих планов по исправлению этого в более ранних версиях Windows. Вы можете отправить запрос в службу поддержки продуктов Microsoft, если это важно для вас. Вы также можете немного изменить свой манифест, чтобы событие отображалось правильно - IIRC, эта ошибка появляется только в том случае, если общий размер определенной комбинации строк в манифесте имеет четную длину, поэтому настройка строк в вашем случае может это исправить. - person Doug Cook - MSFT; 11.08.2016