学习TraceLogging事件,使用ETW记录,并使用WPA捕获和分析跟踪

Posted 杜文龙

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习TraceLogging事件,使用ETW记录,并使用WPA捕获和分析跟踪相关的知识,希望对你有一定的参考价值。

优化响应行为的交互

下载WINDOWS评估和部署工具包 (Windows ADK)

保持默认安装

驱动延迟优化的基本步骤包括:

  1. 定义方案并添加 TraceLogging 事件。TraceLogging 是用于日志记录事件的系统,无需清单即可解码,TraceLogging基于windows事件跟踪(ETW),并提供检测代码的简化办法。C#可选的有.NET EventSource类,WinRT有LoggingChannel,社区支持的TraceLoggingDynamic。
  2. 根据交互类设置目标,用户对应用的性能和响应能力有不同的期望。
  3. 若要检查特定交互的确切持续时间,可以使用 Windows 性能分析器 (WPA) 捕获和分析跟踪。
  4. 分析跟踪并查找改进机会。

学习使用TraceLogging

  1. 创建EventSource,创建 EventSource 类的实例。 第一个构造函数参数标识此提供程序的名称。

    private static EventSource log = new EventSource("TraceLoggingProvider");
    

    实例标注为静态,因为一次应用程序中只有一个特定提供程序的一个实例。

  2. 日志TraceLogging事件

    log.Write("Event 1");
    
    log.Write("Event 2", new  someEventData = DateTime.Now );
    
    ExampleStructuredData EventData = new ExampleStructuredData()  TransactionID = 1234, TransactionDate = DateTime.Now ;
    log.Write("Event 3", EventData); 
    
    [EventData]  
    public sealed class ExampleStructuredData
    
       public int TransactionID  get; set; 
       public DateTime TransactionDate  get; set; 
    
    

    注意下面的
    这个Name是你的提供程序记录事件。

    1. 把下面的文件保存成.WPRP后缀,名字随便起。
    <?xml version="1.0" encoding="utf-8"?>
    <!-- TODO: 
    1. Find and replace "TraceLoggingProvider" with the name of your provider.
    2. See TODO below to update GUID for your event provider
    -->
    <WindowsPerformanceRecorder Version="1.0" Author="Microsoft Corporation" Copyright="Microsoft Corporation" Company="Microsoft Corporation">
     <Profiles>
       <EventCollector Id="EventCollector_TraceLoggingProvider" Name="TraceLoggingProvider">
         <BufferSize Value="64" />
         <Buffers Value="4" />
       </EventCollector>
    
       <!-- TODO:
       1. Update Name attribute in EventProvider xml element with your provider GUID, eg: Name="0205c616-cf97-5c11-9756-56a2cee02ca7". Or
          if you specify an EventSource C# provider or call TraceLoggingRegister(...) without a GUID, use star (*) before your provider
          name, eg: Name="*MyEventSourceProvider" which will enable your provider appropriately.
       2. This sample lists one EventProvider xml element and references it in a Profile with EventProviderId xml element.
          For your component wprp, enable the required number of providers and fix the Profile xml element appropriately
       -->
       <EventProvider Id="EventProvider_TraceLoggingProvider" Name="*TraceLoggingProvider" />
    
       <Profile Id="TraceLoggingProvider.Verbose.File" Name="TraceLoggingProvider" Description="TraceLoggingProvider" LoggingMode="File" DetailLevel="Verbose">
         <Collectors>
           <EventCollectorId Value="EventCollector_TraceLoggingProvider">
             <EventProviders>
               <!-- TODO:
               1. Fix your EventProviderId with Value same as the Id attribute on EventProvider xml element above
               -->
               <EventProviderId Value="EventProvider_TraceLoggingProvider" />
             </EventProviders>
           </EventCollectorId>
         </Collectors>
       </Profile>
    
       <Profile Id="TraceLoggingProvider.Light.File" Name="TraceLoggingProvider" Description="TraceLoggingProvider" Base="TraceLoggingProvider.Verbose.File" LoggingMode="File" DetailLevel="Light" />
       <Profile Id="TraceLoggingProvider.Verbose.Memory" Name="TraceLoggingProvider" Description="TraceLoggingProvider" Base="TraceLoggingProvider.Verbose.File" LoggingMode="Memory" DetailLevel="Verbose" />
       <Profile Id="TraceLoggingProvider.Light.Memory" Name="TraceLoggingProvider" Description="TraceLoggingProvider" Base="TraceLoggingProvider.Verbose.File" LoggingMode="Memory" DetailLevel="Light" />
    
     </Profiles>
    </WindowsPerformanceRecorder>
    
    1. 打开CMD使用管理员进入到你保存XML的路径启动wpr.exe

"C:\\Program Files (x86)\\Windows Kits\\10\\Windows Performance Toolkit\\WPR.exe" -start MyEventSourceProvider.WPRP
5. 允许包含事件的应用程序。
6. 停止跟踪捕获
"C:\\Program Files (x86)\\Windows Kits\\10\\Windows Performance Toolkit\\WPR.exe" -stop TraceCaptureFile.etl description

使用windows 性能分析器查看TracLogging数据

在刚才的目录下生成一个.etl文件,WPA是目前唯一可以查看TracLogging文件的查看器

  1. 启动WPA, 加载文件
    "C:\\Program Files (x86)\\Windows Kits\\10\\Windows Performance Toolkit\\WPA.exe" TraceCaptureFile.etl
  2. 查看提供程序事件。在WPA图形资源管理器中,展开“系统活动(System Activity)”。
  3. 双击“泛型事件(Generic Events)”中的分析窗格中的事件。
  4. 在分析窗格中,找到提供程序的事件,验证TraceLogging是否正常工作。
Microsoft Windows [版本 10.0.22621.1555]
(c) Microsoft Corporation。保留所有权利。

C:\\Users\\Administrator>cd D:\\WinUI3\\TraceLogging

C:\\Users\\Administrator>d:

D:\\WinUI3\\TraceLogging>"C:\\Program Files (x86)\\Windows Kits\\10\\Windows Performance Toolkit\\WPR.exe" -start MyEventSourceProvider.WPRP

D:\\WinUI3\\TraceLogging>"C:\\Program Files (x86)\\Windows Kits\\10\\Windows Performance Toolkit\\WPR.exe" -stop TraceCaptureFile.etl description

D:\\WinUI3\\TraceLogging>"C:\\Program Files (x86)\\Windows Kits\\10\\Windows Performance Toolkit\\WPA.exe" TraceCaptureFile.etl
  1. 在分析窗口中,可以看到我们创建的TraceLoggingProvider的Event1、Event2、Event3。

图床不能用了。没有图了,自己测试一下就好了。

后续的资料。
Windows 性能分析器 | Microsoft Learn

如何使用 ETW 编写自定义堆栈跟踪

【中文标题】如何使用 ETW 编写自定义堆栈跟踪【英文标题】:How to write a custom stack trace using ETW 【发布时间】:2017-07-08 17:28:12 【问题描述】:

Windows 事件跟踪 (ETW) 具有使用事件流捕获堆栈跟踪的功能。我假设它们是使用 EVENT_HEADER_EXT_TYPE_STACK_TRACE32(或 64)标头获取/编码的。但是,事件标头不受事件源 POV 的控制。

https://msdn.microsoft.com/en-us/library/windows/desktop/aa363760%28v=vs.85%29.aspx

在我的 .net 应用程序中,我通过观察在另一个线程(UI 线程)中诊断出一个特定情况。我可以收集暴露条件的堆栈跟踪,数据片段已经到位,但我想使用 ETW 及其工具链进行进一步分析。

[顺便说一句,是的,我正在寻找拦截器,但是虽然现有的基础架构非常适合诊断已知的单个拦截器,但我需要了解一下,在这种情况下,事件关联还不够。此外,收集的数据很容易压倒我需要收集的设备。我的探测器要聪明得多,至少对我来说是这样。]

所以我正在寻找(按优先顺序)

    一种将我收集的堆栈替换为事件的方法 标题 为堆栈跟踪使用另一个属性,以及一种方法 告诉工具(perfview 或 xperf)改用这个 一种方法 编写没有 ETW(但在 .net 中)的 ETW .etl 兼容文件,完整 控制标题(我不需要实时功能)

指点任何人?

【问题讨论】:

【参考方案1】:

我选择了选项 4:使用完全不同的格式,至少一个工具可以提取和分析。在这种情况下,编写了一个 .perfView.xml 文件并完成了这项工作,尽管分析功能不如我所愿。

【讨论】:

【参考方案2】:

为此使用隐藏的 etw 命令:‘Hidden’ ETW Stack Trace Feature – Get Stacks All Over the Place!

【讨论】:

不幸的是,这正是我已经在使用的功能,但它不适合一些边缘情况。

以上是关于学习TraceLogging事件,使用ETW记录,并使用WPA捕获和分析跟踪的主要内容,如果未能解决你的问题,请参考以下文章

从多个进程和同一进程内注册相同的 ETW TraceLogging 提供程序 GUID

列出 ETW 提供程序的事件类

如何使用 Windows 性能分析器查看 EventSource 创建的 ETW 事件?

如何使用 ETW 编写自定义堆栈跟踪

在 Windows 事件跟踪 (ETW) 中,TraceEventSession 不会从记事本中捕获读取事件

perfmon 性能计数器是不是基于与 xperf 使用的 ETW 事件“底层”相同的东西?