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

时间:2016-06-09 09:27:08

标签: c# etw etw-eventsource

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

  

[Event(1,Message =“在开始的基础上发生的事情:{0}”)]

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

  

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

我开始

  

意外错误:算术运算导致溢出。

  1. 有没有办法解决它并且不改变我的类的结构?
  2. 有没有办法调试或至少以某种方式调查eventRegister.exe中的错误?
  3. 我的命令行是:

      

    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

1 个答案:

答案 0 :(得分:0)

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

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

如果您没有使用清单,可以在.csproj文件中禁用EventRegister,也可以让您的项目依赖于" EventSource Redistributable"而不是" EventSource",这将使您无需向构建过程添加EventRegister即可访问EventSource DLL。

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

最后需要注意的是,.NET 4.6和NuGet 1.1.24及更高版本的EventSource有一个"无显式的"完全消除清单的选项。它们还有一个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"
});
相关问题