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

标签 c# c++ etw

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

如果未安装 list ,C++ 提供程序的事件将显示在 perfview 中,其中包含提供程序的 GUID、事件 ID 等。没有像提供程序名称、事件名称这样的“字符串”属性。 但是 C# 提供程序的事件具有这些属性。 为什么 C# 提供程序可以做到这一点?在 EventSource.cs 中,只有当我使用 C# 提供程序时,才会记录 SendManifest 方法和附加的 ManifestData 事件。这是理由吗?如果是这样,C++ 提供程序能否实现此行为?

编辑 我知道如何使用 wevtutil.exe 或 eventregister.exe 安装 list 。经过一些研究,我发现我需要用 C++ 实现“自描述”事件。

最佳答案

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

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

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

如果您想使用基于 list 的 ETW,另一个答案也是正确且有效的。对于基于 list 的事件,唯一官方支持的系统是注册 list 。 EventSource 使用的系统(它将 list 的拷贝扔到 ETW 中)没有详细记录,所有 ETW 解码工具都不支持,我不确定是否有任何支持你这样做你自己。如果你只是对收集和解码日志文件感兴趣,你只需要在你将要进行解码的机器上注册 list ( list 只用于合并和解码——当它不需要时正在捕获日志)。

关于c# - ETW C++ 提供程序和 C# 提供程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37214508/

相关文章:

c# - c#中的锁定错误

.net - 跟踪 Windows API 调用

c# - 通过多行正则表达式匹配

c# - 如何在 C# 中使用具有 %UserProfile% 的字符串复制文件

c++ - 如果字符串实例在 printf 中使用,如何在 GCC 中检测?

c++ - Boost:spsc queue:我可以将它用于用户定义的类型吗?

c# - 使用EventFlow监控本地机器上的ETW事件

c# - 注册 ETW 提供商时遇到问题

c# - 如何将依赖项注入(inject) ELMAH 自定义错误日志?

c++ - boost spirit , boost 任何和引用的字符串 - 编译时错误