【发布时间】:2017-08-24 17:23:20
【问题描述】:
我正在尝试了解如何使 ETW 跟踪可靠地工作。我遇到的问题是我没有始终如一地收到我需要的 FileIo 破败或名称事件,以便在驱动程序级别将文件名与 DiskIo 事件相关联。我正在使用实时事件跟踪。我研究了会话结束时从 ETW 返回的统计数据,我似乎没有丢弃事件(EventsLost 和 RealTimeBuffersLost 始终为零)。在某些情况下,我会收到 FileName/FileRundown 事件,而在其他情况下则不会。
我在这个帖子中找到了一些有用的信息:How to determine the file name involved in an IO operation using windows etw tracing?。在那里我找到了一些指向 ProcessHacker (http://processhacker.sourceforge.net/doc/etwmon_8c_source.html) 源代码的链接。研究 ProcessHacker 代码,我发现与我设置事件跟踪的方式存在一些差异。我想知道这些差异是否导致了我的问题?
首先,ProcessHacker 设置了两个跟踪会话。一个接收大量所需的 ETW 事件(FileIo、DiskIo、NetworkIo)。另一个只查找 FileRundown 事件。在我的应用程序中,我使用一个跟踪会话来捕获所有内容。我注意到关于用于概要会话的 EVENT_TRACE_PROPERTIES 的一个有趣的事情是它没有指定任何 EnableFlags。 “主”会话使用我期望的标志(DISK_IO、FILE_IO、NETWORK_TCPIP)。
其次,ProcessHacker 使用较新的“EventRecord”回调而不是旧的“EventTrace”回调。我的应用程序正在使用“旧”EventTrace 回调。通过在 EVENT_TRACE_LOGFILE 结构中指定 PROCESS_TRACE_MODE_EVENT_RECORD 进行此选择。
这些差异是否会导致我看到的行为?
【问题讨论】: