c-检测ETW何时丢弃事件



如何确定ETW会话是否正在丢弃事件

如果它正在删除事件,我如何配置跟踪会话以使事件不被删除

我已经编写了一个自定义ETW提供程序来帮助进行一些调试工作。我目前正在使用logman.exe捕获跟踪数据。

在查看结果时,某些事件似乎已被删除。基本上,我在寻找类似的东西:

事件A事件C

其中它们应该是一个介入事件B,但没有出现在跟踪文件中。这应该不可能发生,这让我相信ETW正在丢弃事件。

当然,我想验证一下,我看到的问题是由丢弃的事件引起的,而不是由我的代码中的错误引起的。我试过谷歌,但什么都没想到。有人知道我如何检查事件是否被删除吗?

它没有直接回答这个问题(如何检测滴剂),但它可能会解释滴剂:

EVENT_TRACE_NO_PER_PROCESSOR_BUFFERING

将记录在不同处理器上的事件写入公用缓冲器使用此模式可以消除事件出现的问题在不同处理器上发布事件时出现故障使用系统时间。此模式还可以消除出现在多个处理器上丢弃事件的循环日志计算机。

如果不使用此模式而使用系统时间,则事件可能在多处理器计算机上出现故障。这是因为ETW缓冲区与处理器而不是线程相关联。作为结果,如果线程从一个CPU切换到另一个CPU,则缓冲区与后一个CPU关联的可以在前一个CPU之前刷新到磁盘与前一CPU相关联。

如果您预计会发生大量事件(例如,超过1000每秒事件数),则不应使用此模式。

请注意,事件中不包括处理器编号。不在Windows 7和Windows Server 2008 R2之前提供。

我一直在使用logman来获取结果。看起来tracelog会给我关于丢失事件的信息,我可以推特它的缓冲区参数以减少事件丢失。

如果使用xperf收集日志,它会在事件丢失时生成警告。使用xperf,您还可以使用缓冲区大小,并可以将日志记录划分为多个记录器。

最新更新