Активировать стеки только для некоторых конкретных задач ETW в провайдере?

С Windows 7 можно активировать callstacks для событий usermode . Это прекрасно работает, но иногда активирование стеков для всех задач / событий в провайдере не требуется, и было бы неплохо активировать стеки для некоторых конкретных задач. Это возможно?

Да, это возможно с 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 со стеками для захвата стеков для исключений и загрузчика Мероприятия.

                                                                                                       

Когда вы запускаете 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 , загрузите отладочные символы, которые вы можете увидеть стеки для данных исключения, но не для событий Jit или GC:

WPA_dotNetRuntime_Events_some_withStacks

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

Давайте будем гением компьютера.