激活堆栈仅适用于提供者中的某些特定的ETW任务?

从Windows 7开始,可以激活用户模式事件的调用堆栈 。 这可以正常工作,但是有时在一个提供程序中为所有任务/事件激活堆栈是不需要的,只需要为某些特定的任务激活堆栈就好了。 这可能吗?

是的,从Windows 8.1开始,在调用EnableTraceEx2时设置为EVENT_FILTER_TYPE_STACKWALK时,可以在_EVENT_FILTER_DESCRIPTOR中inputtypes。

在Windows 8.1,Windows Server 2012 R2及更高版本中,EnableTraceEx2函数和ENABLE_TRACE_PARAMETERS和EVENT_FILTER_DESCRIPTOR结构可以使用事件有效内容,作用域和堆栈遍历筛选器筛选logging器会话中的特定条件。

为提供者启用堆栈行时,将为由提供者生成的所有事件捕获堆栈。 大多数情况下,用户只对一定数量的事件感兴趣。

此function允许启用或禁用堆栈在事件列表上行走。 提供的filter包含一个EVENT_FILTER_EVENT_ID结构,其中包含一个事件ID数组和一个布尔值,该值指示是否启用或禁用指定事件的堆栈捕获。 每个事件写入调用将快速通过这个数组,以找出是否应该捕获堆栈。

使用Windows性能logging器 ,可以在WPRconfiguration文件中使用第二个EventCollectorId条目实现此目的,该条目具有启用了stackwalking的EventProviders条目。

在这个演示configuration文件中,我为提供程序Microsoft-Windows-DotNETRuntime创build了一个EventProvider( EventProvider_DotNETRuntime ),用于捕获提供程序Microsoft-Windows-DotNETRuntime JIT和GC数据以及另一个EventProvider( EventProvider_DotNETRuntime_Stack ),以便为Exceptions和Loader捕获堆栈活动。

 <?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性能分析器打开跟踪, 加载debugging符号,您可以看到exception数据的堆栈,但不是Jit或GC事件:

WPA_dotNetRuntime_Events_some_withStacks

注意。 在Windows 7或Windows 8(Build 9200)下运行时,提供程序的最后一个EventLogger将与指定的关键字和堆栈选项一起使用。 在这里您应该创build2个WPRPconfiguration文件并检测Windows版本并运行正确的configuration文件。

Interesting Posts