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 函数中将对象数组发送到 EventWrittenEventArgsPayload 属性 =]

我会得到一个 PayloadCount 为 2,它会包含一个 string 和一个 SysLogSeverity 实例。

我最近将 Visual Studio 升级到 2015,现在,我的 Payload 只包含一个 属性 - stringSysLogSeverity 不再通过 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.