使用 eventRegister.exe 的算术运算导致溢出

Arithmetic operation resulted in an overflow using eventRegister.exe

我正在尝试使用 ETW 日志编译一个简单的项目。已将 EventSource 添加为 NuGet 参考。当我有 Event 这样的属性时

[Event(1, Message = "Something happend in base at begin: {0}")]

它没有用,但至少编译成功了。然后我改了属性就变成了这个样子

[Event(2, Level = EventLevel.Error, Message = "Base stp {0}", Keywords = EventKeywords.All)]

然后我开始得到

Unexpected error: Arithmetic operation resulted in an overflow.

  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" "Documents\Visual Studio 2015\Projects\Console1\Common\bin\Debug\Common.dll"

可以找到测试示例的代码here

在这种情况下,问题是在事件定义中使用了 "Keywords = EventKeywords.All"。 EventKeywords.All 不适用于活动。这意味着 "all 64 keywords",这实际上是非法的,因为保留了最高位。 EventKeywords.All 值是为方便设置事件侦听器或检查事件掩码而定义的,但不应在定义事件时使用。在这种情况下,EventRegister 不期望事件将其用于关键字值,因此它遇到了异常。 (这在 运行 时也会有问题,因为 EventSource 会抱怨使用保留关键字。)

您是否正在使用 EventRegister 创建的清单? EventRegister 工具反映您的程序集,并为您的程序集中继承自 EventSource 的每个 class 生成一个清单文件。如果您不使用它生成的清单,则不需要 运行 它。有几件事可能会混淆 EventRegister 工具并导致其失败。

如果您不使用清单,您可以在 .csproj 文件中禁用 EventRegister,或者您可以让您的项目依赖于 "EventSource Redistributable" 而不是 "EventSource",这样您就可以访问到 EventSource DLL,而不将 EventRegister 添加到构建过程。

另请注意,EventSource 内置于 .NET 4.5 及更高版本中——如果您需要在较旧的 .NET 运行 上运行您的项目,则仅需要 NuGet。内置版本的执行速度也快得多(因为它不需要那么多 JIT——所有内置 运行time DLL 在安装过程中都会得到 JIT)。

最后要注意的是,.NET 4.6 和 NuGet 1.1.24 及更高版本的 EventSource 有一个 "manifest-free" 选项可以完全消除清单。它们还有一个 eventSource.Write 方法,允许您直接编写事件而无需跟踪事件 ID。所以代替:

[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"
});