Активировать стеки только для некоторых конкретных задач 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:

WPA_dotNetRuntime_Events_some_withStacks

Внимание. Когда вы запускаете это в Windows 7 или Windows 8 (сборка 9200), последний EventLogger для провайдера используется с указанными ключевыми словами и параметрами стека. Здесь вы должны создать 2 профиля WPR P, определить версию Windows и запустить правильный профиль.

Другие вопросы по тегам