0

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

如果它正在丢弃事件,我如何配置跟踪会话以便不丢弃事件?

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

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

事件 A 事件 C

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

当然,我想验证我看到的问题是由于事件丢失,而不是由我的代码中的错误引起的。我试过谷歌,但什么都想不出来。有谁知道我如何检查事件是否被丢弃?

4

3 回答 3

1

它没有直接回答问题(如何检测跌落),但它可能会解释跌落:

EVENT_TRACE_NO_PER_PROCESSOR_BUFFERING

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

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

如果您预计会有大量事件(例如,每秒超过 1,000 个事件),则不应使用此模式。

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

于 2012-01-29T16:28:26.130 回答
0

我一直在使用 logman 来捕获结果。看起来跟踪日志会给我有关丢失事件的信息,我可以调整它的缓冲区参数以减少事件丢失。

于 2012-01-20T19:26:30.080 回答
0

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

于 2012-10-24T11:23:50.030 回答