ETW - Windows 8.1 - EventWrittenEventArgs Payload缺少数据

时间:2015-09-18 15:28:01

标签: windows-8.1 event-listener payload etw

我在PCL中有一些ETW代码被引用并用于已经工作了几个月的Windows 8.1应用程序中。具体来说,这行代码:

WriteEvent((int)errorId, message, (useSysLog ? sysLogErrorId : SysLogSeverity.NotSpecified));

一直在我的Payload的{​​{1}}函数中向EventWrittenEventArgs的{​​{1}}属性发送一个对象数组。

我会得到OnEventWritten EventListener为2,它会包含PayloadCount个实例。

我最近将Visual Studio升级到2015,现在,我的string只包含一个属性 - SysLogSeverityPayload中不再显示string

升级到VS2015可能是我的问题吗?升级发生时,ETW代码所在的库没有改变。我检查了项目的git历史记录,没有任何程序集版本发生变化。

我为何会发生这种情况感到茫然,并且非常感谢有关如何调试此事件/可能发生的事情的任何想法。

更新

这是我的帮助方法看起来正在调用SysLogSeverity函数:

OnEventWritten

这是_errorLevelsMap的定义:

WriteEvent

签名匹配,[NonEvent] private void _WriteEvent(int errorId, string message, SysLogSeverity sysLogSeverity) { if (_errorLevelsMap.ContainsKey((ErrorIds)errorId)) { sysLogSeverity = _errorLevelsMap[(ErrorIds)errorId]; } if (this.IsEnabled()) { WriteEvent((int)errorId, message, sysLogSeverity); } } 仅包含 private readonly Dictionary<ErrorIds, SysLogSeverity> _errorLevelsMap = new Dictionary<ErrorIds, SysLogSeverity> { { ErrorIds.Critical, SysLogSeverity.Critical }, { ErrorIds.Error, SysLogSeverity.Error }, { ErrorIds.Informational, SysLogSeverity.Informational }, { ErrorIds.Verbose, SysLogSeverity.Debug }, { ErrorIds.Warning, SysLogSeverity.Warning } }; ;不是Payload

谢谢!

1 个答案:

答案 0 :(得分:0)

您需要在调用WriteEvent的方法中使用相同数量的参数,因为EventSource库会根据这些参数生成清单,而不是您传递给WriteEvent的参数。

来自_EventSourceUsersGuide.docx(第6页):

  

传递给ETW方法的参数的数量和类型必须   完全匹配传递给它调用的WriteEvent重载的类型。