windows 8.1 - ¿Activar pilas solo para algunas tareas ETW específicas en un proveedor?
windows-8.1 stack-trace (1)
Desde Windows 7 es posible activar las pilas de llamadas para eventos de modo de usuario . Esto funciona bien, pero a veces no es necesario activar las pilas para todas las tareas / eventos en un proveedor y sería bueno activar solo las pilas para algunas tareas específicas. es posible?
Sí, esto es posible desde Windows 8.1 con la entrada de tipo _EVENT_FILTER_DESCRIPTOR cuando se establece en _EVENT_FILTER_DESCRIPTOR cuando llama a EnableTraceEx2.
En Windows 8.1, Windows Server 2012 R2 y versiones posteriores, la función EnableTraceEx2 y las estructuras ENABLE_TRACE_PARAMETERS y EVENT_FILTER_DESCRIPTOR pueden usar filtros de carga útil de eventos, alcance y paso de pila para filtrar condiciones específicas en una sesión de registrador.
Cuando se activa la caminata de la pila para un proveedor, la pila se captura para todos los eventos generados por el proveedor. La mayoría de las veces, el usuario solo está interesado en la pila de solo cierto número de eventos.
Esta característica permite habilitar o deshabilitar el recorrido de la pila en una lista de eventos. El filtro proporcionado incluye una estructura EVENT_FILTER_EVENT_ID que contiene una matriz de ID de eventos y un valor booleano que indica si se debe habilitar o deshabilitar la captura de la pila para los eventos especificados. Cada llamada de escritura de evento pasará por esta matriz rápidamente para averiguar si la pila debe capturarse o no.
Con Windows Performance Recorder , es posible lograr esto en el perfil WPR con una segunda entrada EventCollectorId que tiene una entrada EventProviders donde se habilita stackwalking.
En este perfil de demostración, creé un EventProvider (
EventProvider_DotNETRuntime
) para el proveedor
Microsoft-Windows-DotNETRuntime
sin pilas para capturar datos JIT y GC y otro EventProvider (
EventProvider_DotNETRuntime_Stack
) para el proveedor
Microsoft-Windows-DotNETRuntime
con pilas para capturar pilas para Excepciones y Loader Eventos.
<?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>
Cuando ahora ejecuta Windows Performance Recorder para capturar los datos:
"C:/Program Files (x86)/Windows Kits/8.1/Windows Performance Toolkit/wpr.exe" -start DotNetRuntime.wprp
, detén la grabación
"C:/Program Files (x86)/Windows Kits/8.1/Windows Performance Toolkit/wpr.exe" -stop Result.etl
abra el seguimiento con Windows Performance Analyzer , cargue los símbolos de depuración , puede ver las pilas para los datos de excepción, pero no para los eventos Jit o GC:
Atención. Cuando ejecuta esto en Windows 7 o Windows 8 (Build 9200), el último EventLogger para el proveedor se usa con las palabras clave especificadas y las opciones de pila. Aquí debe crear 2 perfiles WPRP y detectar la versión de Windows y ejecutar el perfil correcto.