繁体   English   中英

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

[英]ETW C++ provider and C# provider

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

如果未安装清单,则C ++提供程序的事件会在perfview中显示, 带有提供程序的GUID,事件ID等。没有“字符串化”属性,例如提供程序名称,事件名称。 但是C#提供者的事件具有这些属性。 为什么C#提供程序可以做到这一点? 在EventSource.cs中,有SendManifest方法,并且仅当我使用C#提供程序时才记录其他ManifestData事件。 这是原因吗? 如果是这样,C ++提供程序可以实现此行为吗?

编辑我知道如何使用wevtutil.exe或eventregister.exe安装清单。 经过研究,我发现我有必要在C ++中实现“自我描述”事件。

据我所知,TraceEvent在ETL流的运行期间发出清单,然后可以由WPA对其进行解码。 然后,WPA可以显示字符串名称。 如果您同时运行C#和C ++提供程序,则应该看到一个带有名称的ETW提供程序。 我个人已经通过从C#ETW提供程序创建清单,然后使用wevtutil在您的系统中注册了清单来解决此问题。 然后,我总是会得到一个名字,但是我需要拥有管理员权限。

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

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解码工具均不支持该系统,而且我不确定这样做是否对您有任何支持你自己。 如果您只想收集和解码日志文件,则只需要在要进行解码的计算机上注册清单(清单仅用于合并和解码,在以下情况下不需要此清单)日志被捕获)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM