是的,从 Windows 8.1 开始,这是可能的,其中的类型条目_EVENT_FILTER_DESCRIPTOR当它设置为EVENT_FILTER_TYPE_STACKWALK当您调用 EnableTraceEx2 时。
在 Windows 8.1、Windows Server 2012 R2 及更高版本上,事件负载,
EnableTraceEx2 可以使用作用域和堆栈遍历过滤器
函数以及 ENABLE_TRACE_PARAMETERS 和 EVENT_FILTER_DESCRIPTOR
用于过滤记录器会话中特定条件的结构。
当为提供者启用堆栈遍历时,堆栈将是
捕获提供者生成的所有事件。大部分的
有时,用户只对特定数量的堆栈感兴趣
事件。
此功能允许启用或禁用列表上的堆栈遍历
事件。提供的过滤器包含 EVENT_FILTER_EVENT_ID 结构
包含事件 ID 数组和指示的布尔值
是否启用或禁用指定事件的堆栈捕获。
每个事件写入调用都会快速浏览该数组以找出答案
是否应该捕获堆栈。
With Windows 性能记录器有可能实现这一目标WPR简介第二个事件收集器ID条目有一个事件提供者启用 stackwalking 的条目。
在此演示配置文件中,我创建了一个 EventProvider (EventProvider_DotNETRuntime
) 对于提供者Microsoft-Windows-DotNETRuntime
没有堆栈来捕获 JIT 和 GC 数据以及其他 EventProvider (EventProvider_DotNETRuntime_Stack
) 对于提供者Microsoft-Windows-DotNETRuntime
使用堆栈来捕获异常和加载程序事件的堆栈。
<?xml version="1.0" encoding="utf-8"?>
<WindowsPerformanceRecorder Version="1.0" Author="MagicAndre1981" Copyright="MagicAndre1981">
<Profiles>
<SystemCollector Id="SystemCollector" Name="NT Kernel Logger">
<BufferSize Value="1024" />
<Buffers Value="384" />
</SystemCollector>
<EventCollector Id="EventCollector_DotNETRuntime_Session" Name="DotNETRuntime_Session">
<BufferSize Value="1024" />
<Buffers Value="128" />
</EventCollector>
<EventCollector Id="EventCollector_DotNETRuntime_with_Stack" Name="DotNETRuntime_Session_with_Stack">
<BufferSize Value="1024" />
<Buffers Value="128" />
</EventCollector>
<SystemProvider Id="SystemProvider">
<Keywords>
<Keyword Value="ProcessThread" /> <!--PROC_THREAD-->
<Keyword Value="Loader" /> <!--LOADER-->
<Keyword Value="SampledProfile" /> <!--PROFILE-->
<Keyword Value="Interrupt"/> <!--INTERRUPT-->
<Keyword Value="DPC"/> <!--DPC-->
<Keyword Value="ReadyThread" /> <!--Dispatcher-->
<Keyword Value="CSwitch" /> <!--CSwitch-->
</Keywords>
<Stacks>
<Stack Value="SampledProfile" /> <!--Profile-->
<Stack Value="CSwitch" /> <!--CSwitch-->
<Stack Value="ReadyThread" /> <!--ReadyThread-->
<Stack Value="ImageLoad" /> <!--ImageLoad-->
<Stack Value="ImageUnload" /> <!--ImageUnload-->
</Stacks>
</SystemProvider>
<EventProvider Id="EventProvider_DotNETRuntime" Name="Microsoft-Windows-DotNETRuntime" Level="5" Stack="false">
<Keywords>
<Keyword Value="0x111" /> <!--GCKeyword, JitKeyword, JitRundownKeyword, EndRundownKeyword -->
</Keywords>
</EventProvider>
<EventProvider Id="EventProvider_DotNETRuntime_Stack" Name="Microsoft-Windows-DotNETRuntime" Level="5" Stack="true">
<Keywords>
<Keyword Value="0x8008" /> <!--LoaderKeyword, LoaderRundownKeyword, ExceptionKeyword -->
</Keywords>
</EventProvider>
<EventProvider Id="EventProvider_DotNETRuntimePrivate" Name="763fd754-7086-4dfe-95eb-c01a46faf4ca" Level="5" Stack="false">
<Keywords>
<Keyword Value="0xE" />
</Keywords>
</EventProvider>
<EventProvider Id="EventProvider_DotNETRuntimeRundown_CaptureState" Name="Microsoft-Windows-DotNETRuntimeRundown" Level="5" CaptureStateOnly="true" Stack="false">
<CaptureStateOnSave>
<Keyword Value="0x118" />
</CaptureStateOnSave>
</EventProvider>
<Profile Id="DotNetRuntimeProfile.Verbose.File" Name="DotNetRuntimeProfile" Description="DotNetRuntime Profile" LoggingMode="File" DetailLevel="Verbose">
<Collectors>
<SystemCollectorId Value="SystemCollector">
<SystemProviderId Value="SystemProvider" />
</SystemCollectorId>
<EventCollectorId Value="EventCollector_DotNETRuntime_Session">
<EventProviders>
<EventProviderId Value="EventProvider_DotNETRuntime" />
<EventProviderId Value="EventProvider_DotNETRuntimePrivate" />
<EventProviderId Value="EventProvider_DotNETRuntimeRundown_CaptureState" />
</EventProviders>
</EventCollectorId>
<EventCollectorId Value="EventCollector_DotNETRuntime_with_Stack">
<EventProviders>
<EventProviderId Value="EventProvider_DotNETRuntime_Stack" />
</EventProviders>
</EventCollectorId>
</Collectors>
</Profile>
<Profile Id="DotNetRuntimeProfile.Verbose.Memory" Name="DotNetRuntimeProfile" Description="DotNetRuntime Profile" Base="DotNetRuntimeProfile.Verbose.File" LoggingMode="Memory" DetailLevel="Verbose"/>
</Profiles>
<TraceMergeProperties>
<TraceMergeProperty Id="BaseVerboseTraceMergeProperties" Name="BaseTraceMergeProperties" Base="">
<CustomEvents>
<CustomEvent Value="ImageId"/>
<CustomEvent Value="BuildInfo"/>
<CustomEvent Value="VolumeMapping"/>
<CustomEvent Value="EventMetadata"/>
<CustomEvent Value="PerfTrackMetadata"/>
<CustomEvent Value="NetworkInterface"/>
</CustomEvents>
<FileCompression Value="true" />
</TraceMergeProperty>
</TraceMergeProperties>
</WindowsPerformanceRecorder>
当您现在运行 Windows Performance Recorder 来捕获数据时:
"C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\wpr.exe" -start DotNetRuntime.wprp
,停止录音
"C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\wpr.exe" -stop Result.etl
打开跟踪Windows 性能分析器, 加载调试符号您可以看到异常数据的堆栈,但看不到 Jit 或 GC 事件的堆栈:
![WPA_dotNetRuntime_Events_some_withStacks](https://i.stack.imgur.com/XdjLm.png)
注意力。当您在 Windows 7 或 Windows 8(内部版本 9200)下运行此程序时,提供程序的最后一个 EventLogger 将与指定的关键字和堆栈选项一起使用。在这里,您应该创建 2 个 WPRP 配置文件并检测 Windows 版本并运行正确的配置文件。