Арифметическая операция привела к переполнению с помощью eventRegister.exe

Я пытаюсь скомпилировать простой проект с журналами ETW. Добавили EventSource в качестве ссылки NuGet. Когда у меня было Event таких атрибутов

[Событие(1, Сообщение = "Что-то произошло в базе в начале: {0}")]

Он не работал, но, по крайней мере, успешно компилировался. Затем я изменил атрибут, и он стал таким

[Событие (2, Уровень = EventLevel.Error, Сообщение = "Базовый уровень {0}", Ключевые слова = EventKeywords.All)]

И я начал получать

Непредвиденная ошибка: арифметическая операция привела к переполнению.

  1. Есть ли способ исправить это и не менять структуру моих классов?
  2. Есть ли способ отладить или хотя бы как-то исследовать ошибки из eventRegister.exe?

Моя командная строка:

Documents\Visual Studio 2015\Projects\Console1\packages\Microsoft.Diagnostics.Tracing.EventRegister.1.1.28\build\eventRegister.exe" -DumpRegDlls @"Documents\Visual Studio 2015\Projects\Console1\Common\bin\Debug\ Common.eventRegister.rsp" "Документы\Visual Studio 2015\Projects\Console1\Common\bin\Debug\Common.dll"

Код тестового примера можно найти здесь.


person cassandrad    schedule 09.06.2016    source источник
comment
попробуйте класс EventSource без реализации интерфейса   -  person magicandre1981    schedule 09.06.2016
comment
@ magicandre1981, но мне нужен этот интерфейс.   -  person cassandrad    schedule 09.06.2016
comment
почему этот интерфейс важен? попробуй без   -  person magicandre1981    schedule 10.06.2016


Ответы (1)


В данном случае проблема заключается в использовании «Keywords = EventKeywords.All» в определении события. EventKeywords.All не предназначен для использования в событиях. Это означает «все 64 ключевых слова», что на самом деле незаконно, поскольку верхние биты зарезервированы. Значение EventKeywords.All определено для удобства при настройке прослушивателей событий или при проверке масок событий, но его не следует использовать при определении событий. В этом случае EventRegister не ожидал, что события будут использовать это значение для ключевых слов, поэтому возникло исключение. (У этого также были бы проблемы во время выполнения, поскольку EventSource жаловался бы на использование зарезервированных ключевых слов.)

Используете ли вы манифест, который создает EventRegister? Инструмент EventRegister анализирует вашу сборку и создает файл манифеста для каждого класса в вашей сборке, который наследуется от EventSource. Если вы не используете созданный им манифест, вам не нужно его запускать. Есть несколько вещей, которые могут запутать инструмент EventRegister и привести к его сбою.

Если вы не используете манифест, вы можете отключить EventRegister в своем файле .csproj или сделать так, чтобы ваш проект зависел от «EventSource Redistributable» вместо «EventSource», что даст вам доступ к DLL EventSource без добавления EventRegister в процесс сборки.

Также обратите внимание, что EventSource встроен в .NET 4.5 и более поздние версии — NuGet нужен только в том случае, если вам нужно запустить проект в более старой среде выполнения .NET. Встроенная версия также работает НАМНОГО быстрее (поскольку ей не нужно так сильно JIT - все встроенные библиотеки DLL времени выполнения JIT-обрабатываются во время установки).

И последнее замечание: .NET 4.6, NuGet 1.1.24 и более поздние версии EventSource имеют опцию «без манифеста», которая полностью исключает манифест. У них также есть метод eventSource.Write, который позволяет записывать события напрямую, без необходимости отслеживать идентификаторы событий. Итак, вместо:

[EventSource]
class MyEventSource : EventSource
{
    [Event(...)]
    public void MyEvent(...)
    {
        WriteEvent(...);
    }
}

es = new MyEventSource();
es.MyEvent(23, "Hello");

Вы можете просто сделать это:

es = new EventSource("MyEventSourceName");
es.Write("MyEvent", new {
    Number = 23,
    Name = "Hello"
});
person Doug Cook - MSFT    schedule 10.06.2016
comment
Спасибо за предложения. К сожалению, нет, я не могу так писать. Мне нужна сложная структура (с интерфейсами и наследованием), которая есть в примере; это часть архитектуры моего проекта. Мне действительно не нужен файл манифеста (я не использую каналы), но мне нужны проверки времени компиляции на правильность определения моих событий. И я использую пакет NuGet именно из-за этих проверок (и из-за наследования). Будут ли они по-прежнему представлены, если я отключу создание манифеста? - person cassandrad; 14.06.2016
comment
Я не уверен, какие проверки вы получаете из пакета NuGet. Пакет NuGet действительно запускает EventRegister для создания манифеста, но, как вы видели, EventRegister может быть сбит с толку совершенно корректным кодом. Кроме того, EventRegister, вероятно, не обнаружит многие потенциальные проблемы с кодированием, поэтому я не уверен, что EventRegister дает какие-либо преимущества. EventRegister предназначен для создания манифестов во время компиляции, а не для выполнения каких-либо тестов. Если вы не используете манифест, вам не следует использовать EventRegister. - person Doug Cook - MSFT; 16.06.2016
comment
есть проверки, например, что ваш номер ключевого слова должен быть степенью двойки или что ваш производный класс EvenSource должен быть запечатан, и он генерирует ошибки времени компиляции, если это не так. Вы видели что-то подобное? - person cassandrad; 16.06.2016
comment
При более внимательном рассмотрении вашего кода проблема связана с EventKeywords.All. Ваше событие не должно использовать это значение. Если вы хотите, чтобы событие срабатывало независимо от ключевого слова, просто оставьте ключевое слово не заданным. - person Doug Cook - MSFT; 16.06.2016
comment
но почему я не должен использовать это значение? 32 — это степень числа 2. Других ограничений на эти значения я не видел. Есть ли? - person cassandrad; 16.06.2016
comment
EventKeywords.All означает, что установлены все 64 бита. Это не 32 и не степень двойки. Значение All не используется с событиями. Он существует для использования при настройке прослушиваемого или при проверке того, включены ли в конфигурации EventSource определенные биты. - person Doug Cook - MSFT; 17.06.2016