ETW C ++提供程序和C#提供程序

时间:2016-05-13 15:59:34

标签: c# c++ etw

我有基于清单的ETW提供程序,用C ++和C#编写。两个提供程序都使用相同的清单(由C#代码中的Microsoft.Diagnostics.Tracing.TraceEvent包生成)。通道是调试。 两个提供商的事件发布成功(返回值为0),我可以在 perfview 中看到它们。

如果未安装清单,则C ++提供商的事件将显示在 perfview 中,其中包含提供商的GUID,事件ID等。没有"弦"提供者名称,事件名称等属性。 但C#提供商的活动有这些属性。 为什么C#提供商可以做到这一点?在EventSource.cs中,有SendManifest方法,只有在我使用C#提供程序时才会记录其他ManifestData事件。这是一个原因吗?如果是这样,C ++提供者可以实现这种行为吗?

修改 我知道如何使用wevtutil.exe或eventregister.exe安装清单。经过一番研究,我发现我的必要性是实施"自我描述" C ++中的事件。

2 个答案:

答案 0 :(得分:0)

据我所知,TraceEvent在ETL流的断开期间发出清单,然后由WPA解码。然后WPA可以显示字符串化的名称。如果您同时运行C#和C ++提供程序,您应该看到一个名称为ETW的提供程序。我个人通过从我的C#ETW提供者创建一个清单然后在wevtutil的系统中注册它来解决这个问题。然后我总是得到一个名字,但我需要有管理员权限来做到这一点。

请参阅 http://etwcontroler.codeplex.com/SourceControl/latest#ETWControler/ETW/HookEvents.cs

答案 1 :(得分:0)

Windows 10 SDK支持新的ETW系统,根本不需要清单。您可以使用TraceLoggingProvider.h标头生成这些事件。如果使用eventSource.Write方法或设置了无清单标志,则在.NET 4.6或更高版本的EventSource中也支持这个新系统。 (如果您想使用新功能但不想使.NET 4.6成为您的程序的先决条件,还有一个EventSource NuGet包。)

请注意,虽然该技术需要新的sdk,并且您需要新的解码器工具来决定新的日志文件格式,但该技术适用于在Vista或更高版本上运行的程序。换句话说,您需要使用Windows 10 SDK来获取新的TraceLoggingProvider.h标头,但只要您将WINVER宏设置为正确的值,生成的程序就可以在Vista或更高版本上正常运行。您想要定位的操作系统。

主要好处是不需要清单。主要的缺点是您的日志文件会稍微大一些(因为每个事件都需要包含一些有关如何解码自身的信息)。

如果您想使用基于清单的ETW,另一个答案也是正确且有效的。基于清单的事件唯一官方支持的系统是注册清单。 EventSource使用的系统(将清单的副本投入ETW的位置)没有详细记录,并非所有ETW解码工具都支持,而且我不确定是否有& #39;对你自己做的任何支持。如果您只对收集和解码日志文件感兴趣,则只需要在您要进行解码的计算机上注册清单(清单仅用于合并和解码 - 它不是&n在捕获日志时需要#39;