- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试了解如何使 ETW 跟踪可靠地工作。我遇到的问题是我没有始终如一地收到我需要的 FileIo 中断或名称事件,以便在驱动程序级别将文件名与 DiskIo 事件相关联。我正在使用实时事件跟踪。我研究了 session 结束时从 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 设置了两个跟踪 session 。一个接收大量所需的 ETW 事件(FileIo、DiskIo、NetworkIo)。另一个只查找 FileRundown 事件。在我的应用程序中,我使用一个跟踪 session 来捕获所有内容。我注意到关于用于中断 session 的 EVENT_TRACE_PROPERTIES 的一件有趣的事情是它没有指定任何 EnableFlags。 “主” session 使用我期望的标志(DISK_IO、FILE_IO、NETWORK_TCPIP)。
其次,ProcessHacker 使用更新的“EventRecord”回调而不是旧的“EventTrace”回调。我的应用程序使用“旧”EventTrace 回调。此选择是通过在 EVENT_TRACE_LOGFILE 结构中指定 PROCESS_TRACE_MODE_EVENT_RECORD 进行的。
这些差异是否会导致我所看到的行为?
最佳答案
我回答了我自己的问题。关键是我指出的第一个区别。我在两个线程之间拆分事件处理任务,而不是尝试在单个线程中处理所有事情。因此,现在我将 FileIo、DiskIo 和 Image 事件指向一个线程,将 FileCreate、FileRundown 和 FileName 事件指向另一个线程。这解决了问题。
这表明我正在沿链的某个位置删除 ETW 事件。然而,ETW session 统计数据并未报告这一事实(EventsLost RealTimeEventsLost 和 BuffersLost 均为零)。
我想这应该是显而易见的,但在尝试处理大量(数百万)ETW 事件时,性能至关重要。就我而言,我正在监听驱动程序级别的事件(DriverCall、DriverComplete 等)。这增加了事件的数量,似乎加剧了我所看到的问题。
在解决这个问题之前,我进行了一些简单的实验。在实验中,我禁用了驱动程序级别的事件。在这种情况下,单线程事件处理器能够跟上 DiskIo 事件和 FileName 事件。一旦我重新打开驱动程序事件,我就会回到无法可靠地接收 FileName 事件的状态。
关于c++ - 将 ETW 文件对象与 DiskIO 事件相关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43123724/
我目前正在使用 Microsoft 网络监视器来解析调试事件跟踪。它不是一个坏工具,但也不是很好。你知道一些更好的解决方案吗? 最佳答案 这些是用于探索自定义 ETW 跟踪的读者: SvcPerf -
我正在使用 Windows API 的事件跟踪,并且不时运行我的应用程序,但它在打开 ETW 跟踪 Controller session 后无法关闭它。 基本上我做::StartTrace([out]
问题:如何查看所有打开的 ETW session ,包括其根路径?我期望一些 PowerShell 命令,如 Get-EtwTraceSession ,但我没有看到任何内容。 背景 我使用 Event
性能计数器是 ETW 的一部分吗?如果不是,两者有什么区别? 最佳答案 性能计数器和 ETW 是不同的技术。性能计数器不通过 ETW 公开。 基本区别:性能计数器提供有关系统行为的高级度量(想想计时器
我正在使用新的 EventSource 类从我的应用程序写入 Windows 事件日志,到目前为止它很棒。但是,我观察到有两件事会导致可能相关的问题:传递给 Event 属性的格式字符串在写入事件日志
我打算使用 ETW,因为它: 强制构建日志记录 低延迟 在另一个进程上消费事件的能力 想法是使用语义日志应用程序 block 等外部进程使用 ETW 事件,并将这些事件转发到中央位置。 我的问题是。如
我有一个使用 native 插件的应用程序。对于这些插件,我有自己的二进制格式。每个插件都在运行时使用类似于将 DLL 映射到进程空间的方法加载。这意味着,每个插件都有自己的 ImageBase,.t
我们使用 AppFabric Monitoring 来检查执行时间并跟踪日志消息。这在一年后运行良好,但一些服务器突然停止监视我们的 WCF 服务。 我在 AppFabric 监控方面有一些经验,并且
我为 CLR 提供程序记录 ETW 事件: xperf -start clr -on e13c0d23-ccbc-4e12-931b-d9cc2eee27e4 -f clr.etl ... xperf
是否有使用 ETW 记录异常的标准方法? 据我所知,这样做的唯一方法是记录消息和可能的内部异常消息,因为异常类型没有强类型参数。 最佳答案 启用时,所有 CLR 异常(第一次机会,以及可能最终导致应用
我正在尝试让我的 Azure 辅助角色的日志出现在 Application Insights 中。当我运行 Get-AzureServiceDiagnosticsExtension 时,我得到以下信息
如何确定 ETW session 是否正在丢弃事件? 如果正在丢弃事件,我如何配置跟踪 session 以便事件不被丢弃? 我编写了一个自定义 ETW 提供程序来帮助进行一些调试工作。我目前正在使用
任务并行库使用 Event Tracing for Windows (ETW)用于记录。显然,在 Windows Phone 或 Windows Store .NET Runtime 下,TPL 或
我想实现一个 ETW C 中的消费者用于来自 Microsoft-Windows-TCPIP 提供程序的事件。但是,我找不到此提供程序生成的事件类型。 我已经做了一些类似的工作来使用来自 Micros
这个问题在这里已经有了答案: How do I log events in Windows IoT? (1 个回答) 关闭 5 年前。 我正在为 Windows 10 IoT 开发基于 UWP 的应
一些人告诉我,ETW 提供了一种机制来捕获用户模式进程进行的系统调用。我已经列举了可用的提供者,并且只提出了两个可能提供此信息的可能性。第一个是 Microsoft-Windows-Kernel-Au
在不使用 list 的情况下卸载/删除以前安装的事件源的最佳方法是什么? 例如。如果我有类似的东西: [EventSource(Name = "Corporation-Module-X")]
我正在尝试使用新的 EventSource(来自 nuget 的 Microsoft.Diagnostics.Tracing.EventSource)及其对 ETW channel 的新支持,以便写入
我们刚刚开始使用 Service Fabric,到目前为止唯一的痛点是使用 WAD 进行 ETW,它似乎总是因丢失数据(消息、事件消息)而注销。 到目前为止,我们的经验是它在 Visual Studi
我们刚刚开始使用 Service Fabric,到目前为止唯一的痛点是使用 WAD 进行 ETW,它似乎总是因丢失数据(消息、事件消息)而注销。 到目前为止,我们的经验是它在 Visual Studi
我是一名优秀的程序员,十分优秀!