Я голосовал над этим вопросом, хотя он был плохо сформирован, потому что он показывает общий источник замешательства. Первоначальный вопрос задал вопрос о том, «как записывать вызовы», но это не очень хорошо сформулированный вопрос. xperf может записывать стеки вызовов для профилировщика выборки, переключений контекста, ввода-вывода файлов, операций ввода-вывода, активности реестра или пользовательских событий. В вопросе не указывалось, какой тип стеков вызовов был записан, что приводит к некоторой путанице.
Давайте посмотрим на исходную командную строку. Я упростил его, удалив PROC_THREAD + LOADER, потому что BASE включает их. Я также удалил -BufferSize 1024, потому что я думаю, что это неуместно, и я заменил GUID именем - вы должны дать своим провайдерам имя и использовать его. Итак, у нас есть:
xperf -on Base -start UserSession -on MyProvider -stackwalk profile
Важно отметить, что у нас есть две директивы «-on». Это означает, что мы начинаем две сессии. Это эквивалентно:
xperf -on Base
xperf -start UserSession -on MyProvider -stackwalk profile
Первые старты команды или подключается к регистратору ядра (без имени сеанса) с провайдером «Base». Вторая команда запускает сеанс пользователя с именем «UserSession» с поставщиком «MyProvider».
Теперь мы видим проблему. «Профиль» - это только допустимый вариант для -stackwalk в контексте регистратора ядра. Нет смысла просить сеанс пользователя записывать стеки вызовов в событиях профиля, поскольку он не регистрирует события профиля! Таким образом, мы получаем этот вариант вопроса OP:
xperf -on Base -stackwalk profile
xperf -start UserSession -on MyProvider
@rem Run tests here
xperf -stop UserSession -stop -d trace.etl
Но подождите! Как насчет стеков вызовов для пользовательских событий в MyProvider?Это то, что первый ответ пытался объяснить, - нам нужно добавить ::: «стек»:
xperf -on Base -stackwalk profile
xperf -start UserSession -on MyProvider:::'stack'
@rem Run tests here
xperf -stop UserSession -stop -d trace.etl
Эти стеки вызовов будут доступны как столбец Stack в Generic Events просмотра в WPA. Список Другие вещи, для которых вы можете записать стек вызовов, см. В разделе «xperf -help stackwalk». И помните, что имеет смысл попросить стеки вызовов для события, которое вы на самом деле записываете. К счастью, база включает профиль, поэтому мы в порядке.
О, да, если вы хотите установить размер буфера и количество буферов, обязательно будьте осторожны в отношении , в котором сеанс (возможно, оба) вы его настраиваете.
Для больше информации, особенно о том, как анализировать XPERF следов, см: https://randomascii.wordpress.com/category/xperf/
Для более простого способа записи ETW следов посмотреть с открытым исходным кодом пользовательского интерфейса для управления записью трассировки - вы можете легко добавить свой собственный провайдер к записываемому списку: https://github.com/google/UIforETW/releases
Я решил проблему, переместив '-stackwalk profile' в позицию до' -start UserSession'. Таким образом, регистратор ядра записывает стоп-код. Я также попробовал с '::: stack', чтобы пользовательский сеанс записывал стоп-код, но похоже, что он не работает. Еще одна вещь, которую нужно иметь в виду - это использовать 'xperf.exe -stop -stop UserSession -d test.etl', чтобы остановить как регистратор ядра, так и регистратор пользователя и объединить буферы вместе. – stanleyli