ETW - Windows 8.1 - EventWrittenEventArgs 负载缺失数据
ETW - Windows 8.1 - EventWrittenEventArgs Payload Missing Data
我在 PCL 中有一些 ETW 代码被引用并在已经运行了几个月的 Windows 8.1 应用程序中使用。具体来说,这行代码:
WriteEvent((int)errorId, message, (useSysLog ? sysLogErrorId : SysLogSeverity.NotSpecified));
一直在我的 EventListener
.[=30 的 OnEventWritten
函数中将对象数组发送到 EventWrittenEventArgs
的 Payload
属性 =]
我会得到一个 Payload
,Count
为 2,它会包含一个 string
和一个 SysLogSeverity
实例。
我最近将 Visual Studio 升级到 2015,现在,我的 Payload
只包含一个 属性 - string
。 SysLogSeverity
不再通过 OnEventWritten
。
升级到 VS2015 会是我的问题吗? ETW 代码所在的库在升级时没有改变。我检查了我的项目的 git 历史记录,没有任何程序集版本发生变化。
我不知道为什么会这样,非常感谢任何关于如何调试 this/what 的想法。
更新:
这是调用 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);
}
}
这是 _errorLevelsMap 的定义:
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
仅包含 message
;不是 sysLogErrorId
.
谢谢!
您需要在调用 WriteEvent
的方法中使用相同数量的参数,因为 EventSource 库根据这些参数而不是您传递给 WriteEvent
的参数生成清单。
来自 _EventSourceUsersGuide.docx
(第 6 页):
The number and types of arguments passed to the ETW method must
exactly match the types passed to the WriteEvent overload it calls.
我在 PCL 中有一些 ETW 代码被引用并在已经运行了几个月的 Windows 8.1 应用程序中使用。具体来说,这行代码:
WriteEvent((int)errorId, message, (useSysLog ? sysLogErrorId : SysLogSeverity.NotSpecified));
一直在我的 EventListener
.[=30 的 OnEventWritten
函数中将对象数组发送到 EventWrittenEventArgs
的 Payload
属性 =]
我会得到一个 Payload
,Count
为 2,它会包含一个 string
和一个 SysLogSeverity
实例。
我最近将 Visual Studio 升级到 2015,现在,我的 Payload
只包含一个 属性 - string
。 SysLogSeverity
不再通过 OnEventWritten
。
升级到 VS2015 会是我的问题吗? ETW 代码所在的库在升级时没有改变。我检查了我的项目的 git 历史记录,没有任何程序集版本发生变化。
我不知道为什么会这样,非常感谢任何关于如何调试 this/what 的想法。
更新:
这是调用 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);
}
}
这是 _errorLevelsMap 的定义:
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
仅包含 message
;不是 sysLogErrorId
.
谢谢!
您需要在调用 WriteEvent
的方法中使用相同数量的参数,因为 EventSource 库根据这些参数而不是您传递给 WriteEvent
的参数生成清单。
来自 _EventSourceUsersGuide.docx
(第 6 页):
The number and types of arguments passed to the ETW method must exactly match the types passed to the WriteEvent overload it calls.