ETW C++ 提供程序和 C# 提供程序
ETW C++ provider and C# provider
我有用 C++ 和 C# 编写的基于清单的 ETW 提供程序。两个提供程序都使用相同的清单(由 Microsoft.Diagnostics.Tracing.TraceEvent
包从 C# 代码生成)。频道是调试。
事件发布在两个提供商中都是成功的(return 值为 0),我可以在 perfview.
中看到它们
如果未安装清单,C++ 提供程序的事件将显示在 perfview 中,其中包含提供程序的 GUID、事件 ID 等。没有 "stringed" 属性 如提供者名称、事件名称。
但是 C# 提供程序的事件具有这些属性。
为什么 C# 提供程序可以做到这一点?在 EventSource.cs 中,有 SendManifest
方法,并且仅当我使用 C# 提供程序时才会记录额外的 ManifestData
事件。这是理由吗?如果是这样,C++ 提供程序能否实现此行为?
编辑
我知道如何使用 wevtutil.exe 或 eventregister.exe 安装清单。经过一些研究,我发现我需要的是在 C++ 中实现 "self-describing" 事件。
据我所知,TraceEvent 在 运行 期间将清单发送到 ETL 流,然后可以由 WPA 解码。然后 WPA 可以显示字符串化的名称。如果您让 运行 同时使用 C# 和 C++ 提供程序,您应该会看到一个具有名称的 ETW 提供程序。就我个人而言,我通过从我的 C# ETW 提供程序创建清单然后使用 wevtutil 在你的系统中注册它来解决这个问题。然后我总是得到一个名字,但我需要有管理员权限才能做到这一点。
见
http://etwcontroler.codeplex.com/SourceControl/latest#ETWControler/ETW/HookEvents.cs
Windows10 SDK 包括对根本不需要清单的新 ETW 系统的支持。您可以使用 TraceLoggingProvider.h header 来生成这些事件。如果您使用 eventSource.Write 方法或设置 manifest-free 标志,此新系统在 .NET 4.6 或更高版本的 EventSource 中也受支持。 (如果您想使用新功能但不想让 .NET 4.6 成为您的程序的先决条件,还有一个 EventSource NuGet 包。)
请注意,虽然该技术需要新的 SDK,并且您需要新的解码器工具来确定新的日志文件格式,但该技术适用于 运行ning 在 Vista 或更高版本上的程序。换句话说,您将需要使用 Windows 10 SDK 来获取新的 TraceLoggingProvider.h header,但生成的程序将 运行 在 Vista 或更高版本上正常运行当您将 WINVER 宏设置为您想要定位的 OS 的正确值时。
主要好处是不需要清单。主要缺点是您的日志文件会有点大(因为每个事件都需要包含一些关于如何解码自身的信息)。
如果您想使用 manifest-based ETW,另一个答案也是正确且有效的。 manifest-based 事件的唯一 officially-supported 系统是注册清单。 EventSource 使用的系统(它将清单的副本扔到 ETW 中)不是 well-documented,所有 ETW 解码工具都不支持,我不确定是否有任何支持自己做。如果你只是对收集和解码日志文件感兴趣,你只需要在你将要进行解码的机器上注册清单(清单只用于合并和解码——当它不需要时正在捕获日志)。
我有用 C++ 和 C# 编写的基于清单的 ETW 提供程序。两个提供程序都使用相同的清单(由 Microsoft.Diagnostics.Tracing.TraceEvent
包从 C# 代码生成)。频道是调试。
事件发布在两个提供商中都是成功的(return 值为 0),我可以在 perfview.
如果未安装清单,C++ 提供程序的事件将显示在 perfview 中,其中包含提供程序的 GUID、事件 ID 等。没有 "stringed" 属性 如提供者名称、事件名称。
但是 C# 提供程序的事件具有这些属性。
为什么 C# 提供程序可以做到这一点?在 EventSource.cs 中,有 SendManifest
方法,并且仅当我使用 C# 提供程序时才会记录额外的 ManifestData
事件。这是理由吗?如果是这样,C++ 提供程序能否实现此行为?
编辑 我知道如何使用 wevtutil.exe 或 eventregister.exe 安装清单。经过一些研究,我发现我需要的是在 C++ 中实现 "self-describing" 事件。
据我所知,TraceEvent 在 运行 期间将清单发送到 ETL 流,然后可以由 WPA 解码。然后 WPA 可以显示字符串化的名称。如果您让 运行 同时使用 C# 和 C++ 提供程序,您应该会看到一个具有名称的 ETW 提供程序。就我个人而言,我通过从我的 C# ETW 提供程序创建清单然后使用 wevtutil 在你的系统中注册它来解决这个问题。然后我总是得到一个名字,但我需要有管理员权限才能做到这一点。
见 http://etwcontroler.codeplex.com/SourceControl/latest#ETWControler/ETW/HookEvents.cs
Windows10 SDK 包括对根本不需要清单的新 ETW 系统的支持。您可以使用 TraceLoggingProvider.h header 来生成这些事件。如果您使用 eventSource.Write 方法或设置 manifest-free 标志,此新系统在 .NET 4.6 或更高版本的 EventSource 中也受支持。 (如果您想使用新功能但不想让 .NET 4.6 成为您的程序的先决条件,还有一个 EventSource NuGet 包。)
请注意,虽然该技术需要新的 SDK,并且您需要新的解码器工具来确定新的日志文件格式,但该技术适用于 运行ning 在 Vista 或更高版本上的程序。换句话说,您将需要使用 Windows 10 SDK 来获取新的 TraceLoggingProvider.h header,但生成的程序将 运行 在 Vista 或更高版本上正常运行当您将 WINVER 宏设置为您想要定位的 OS 的正确值时。
主要好处是不需要清单。主要缺点是您的日志文件会有点大(因为每个事件都需要包含一些关于如何解码自身的信息)。
如果您想使用 manifest-based ETW,另一个答案也是正确且有效的。 manifest-based 事件的唯一 officially-supported 系统是注册清单。 EventSource 使用的系统(它将清单的副本扔到 ETW 中)不是 well-documented,所有 ETW 解码工具都不支持,我不确定是否有任何支持自己做。如果你只是对收集和解码日志文件感兴趣,你只需要在你将要进行解码的机器上注册清单(清单只用于合并和解码——当它不需要时正在捕获日志)。