Активировать стеки только для некоторых конкретных задач ETW в провайдере?
Начиная с Windows 7 можно активировать стеки вызовов для событий пользовательского режима. Это работает нормально, но иногда активировать стеки для всех задач / событий в поставщике не нужно, и было бы неплохо активировать стеки только для некоторых конкретных задач. Это возможно?
1 ответ
Да, это возможно начиная с 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, которая содержит массив идентификаторов событий и логическое значение, указывающее, включать или отключать захват стека для указанных событий. Каждый вызов записи события будет проходить через этот массив быстро, чтобы выяснить, должен ли стек быть захвачен или нет.
С помощью Windows Performance Recorder этого можно добиться в профиле WPR со второй записью EventCollectorId, в которой есть запись EventProviders, где включен стек-обход.
В этом демонстрационном профиле я создал один 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 Performance Analyzer, загрузите символы отладки, которые вы можете видеть стеками для данных исключений, но не для событий Jit или GC:
Внимание. Когда вы запускаете это в Windows 7 или Windows 8 (сборка 9200), последний EventLogger для провайдера используется с указанными ключевыми словами и параметрами стека. Здесь вы должны создать 2 профиля WPR P, определить версию Windows и запустить правильный профиль.