¿Activar Stacks solo para algunas Tareas ETW específicas en un proveedor?

Desde Windows 7, es posible activar callstacks para eventos de modo de usuario . Esto funciona bien, pero a veces no se necesita activar stacks para todas las tareas / Eventos en un proveedor y sería bueno activar solo stacks para algunas Tareas específicas. es posible?

Sí, esto es posible desde Windows 8.1 con la entrada de tipo en _EVENT_FILTER_DESCRIPTOR cuando se establece en EVENT_FILTER_TYPE_STACKWALK cuando se llama a EnableTraceEx2.

En Windows 8.1, Windows Server 2012 R2 y más adelante, la carga de evento, el scope y los filtros de paseo de stack pueden ser utilizados por la función EnableTraceEx2 y las estructuras ENABLE_TRACE_PARAMETERS y EVENT_FILTER_DESCRIPTOR para filtrar condiciones específicas en una sesión de registrador.

Cuando la habilitación de la stack está habilitada para un proveedor, la stack se captura para todos los eventos generados por el proveedor. La mayoría de las veces, el usuario solo está interesado en astackr solo de cierto número de eventos.

Esta característica permite habilitar o deshabilitar el recorrido de la stack en una lista de eventos. El filtro provisto incluye una estructura EVENT_FILTER_EVENT_ID que contiene una matriz de identificaciones de eventos y un valor booleano que indica si habilitar o deshabilitar la captura de la stack para los eventos especificados. Cada llamada de escritura de evento pasará por esta matriz rápidamente para averiguar si la stack 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 está habilitado el stack.

En este perfil de demostración, creé un EventProvider ( EventProvider_DotNETRuntime ) para el proveedor Microsoft-Windows-DotNETRuntime sin stacks para capturar datos JIT y GC y otro EventProvider ( EventProvider_DotNETRuntime_Stack ) para el proveedor Microsoft-Windows-DotNETRuntime con stacks para capturar stacks para Exceptions y Loader Eventos.

 < ?xml version="1.0" encoding="utf-8"?>                                                                                                      

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 

detener la grabación

 "C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\wpr.exe" -stop Result.etl 

abra la traza con Windows Performance Analyzer , cargue los símbolos de depuración , puede ver las stacks de los datos de excepción, pero no para los eventos de Jit o GC:

WPA_dotNetRuntime_Events_some_withStacks

Atención. Cuando ejecuta esto en Windows 7 o Windows 8 (comstackción 9200), el último EventLogger para el proveedor se utiliza con las palabras clave especificadas y las opciones de stack. Aquí debe crear 2 perfiles WPRP y detectar la versión de Windows y ejecutar el perfil correcto.