使用 ETW 改善调试和性能优化
2008-11-17 17:39:25 来源:WEB开发网在新的 ETW 提供程序模型中,ETW 可以代表提供程序记住启用设置。换句话说,提供程序不必检查其当前是否已启用即可注册和调用日志记录调用。在日志记录 API 内部,ETW 会快速查看启用设置,仅当其已启用时才将事件发送给会话。如果它们未启用,则会放弃日志记录调用。因此,在新的模型中,启用/禁用回调是可选的。但在某些情况下,仍然需要启用回调。例如,针对状态机构造的检测在跟踪开始和结束时通常需要快照或状态断开事件。
日志记录 API,即 EventWrite 采用注册句柄(与旧模型中的会话句柄相对)。在日志记录调用中使用注册句柄使启用设置对于提供程序来说是透明的。由于日志记录所用句柄是新模型中的不透明句柄,因此 ETW 能够对事件进行多播。也就是说,提供程序能够为多个 ETW 会话启用,这在旧模型中是无法实现的,后者使用会话句柄。
ETW 提供单独的 API(EventEnabled 和 EventProviderEnabled)用于测试是否启用了提供程序。虽然日志记录 API 在写入事件前已经检查了启用设置,但有时提供程序可能需要在启用跟踪时进行其他工作。收集和构造对于程序执行来说不是必需的信息事件数据,就属于这种情况。如果有需要,提供程序可以随时借助这些 API 查明跟踪是否已启用。
正如前面提到的,用户可以向每个事件添加可变的上下文数据。日志记录 API 使用一种分散/收集机制选择特定于事件的数据项。调用方通过构造数据描述符数组传入额外的事件数据项。数据描述符是一种带有指针和大小字段的结构。因此,用户会为要记录的每个数据项添加一个数据描述符。我们可以使用宏 EventDataDescCreate 轻松地构造数据描述符。然后,ETW 会在日志记录期间将用户提供的内容复制到其会话缓冲区。
更多精彩
赞助商链接