Захват стека вызовов и событий в Xperf
Извините за тупой вопрос. Я новичок в Xperf.
Я на 64-битной Windows 8.1, и мое приложение также x64. Я хочу захватить как callstacks, так и мои определенные события в приложении, используя Xperf.
Я зарегистрировал GUID 35f7872e-9b6d-4a9b-a674-66f1edd66d5c
в моем приложении.
Когда я использовал:
xperf -on PROC_THREAD+LOADER+Base -start UserSession -on 35f7872e-9b6d-4a9b-a674-66f1edd66d5c -BufferSize 1024 -stackwalk profile
Я могу получить все события, но нет стека вызовов. Однако если я удалю -on 35f7872e-9b6d-4a9b-a674-66f1edd66d5c
и командные строки становятся:
xperf -on PROC_THREAD+LOADER+Base -start UserSession -BufferSize 1024 -stackwalk profile
Таким образом, я могу захватить весь колл-стэк, но без определенных событий.
Может кто-нибудь сказать мне, какую правильную командную строку использовать для захвата и стека вызовов и событий? Также, если вы можете указать мне любую хорошую ссылку на Xperf, это будет еще лучше.
2 ответа
Вам нужно добавить :::'stack'
в командной строке для захвата стеков для событий пользовательского режима.
xperf -start UserSession -on 35f7872e-9b6d-4a9b-a674-66f1edd66d5c:::'stack'
Хорошим справочником по xperf является книга "Отладка внутри Windows" и этот блог.
Я проголосовал за этот вопрос, хотя он был плохо сформирован, потому что он показывает общий источник путаницы. Первоначальный вопрос касался "как записывать стеки вызовов", но это не совсем правильно сформулированный вопрос. 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 в контексте регистратора ядра. Нет смысла просить пользовательский сеанс записывать стеки вызовов на события профиля, потому что он не записывает события профиля! Итак, это подводит нас к этому варианту вопроса ОП:
xperf -on Base -stackwalk profile
xperf -start UserSession -on MyProvider
@rem Run tests here
xperf -stop UserSession -stop -d trace.etl
Но ждать! Как насчет стеков вызовов для пользовательских событий в MyProvider? Вот что пытался объяснить первый ответ - нам нужно добавить:::'stack':
xperf -on Base -stackwalk profile
xperf -start UserSession -on MyProvider:::'stack'
@rem Run tests here
xperf -stop UserSession -stop -d trace.etl
Эти стеки вызовов будут доступны в виде столбца стека в представлении общих событий в WPA. Для списка многих других вещей, для которых вы можете записать стек вызовов, смотрите "xperf -help stackwalk". И помните, имеет смысл запрашивать стеки вызовов для события, которое вы фактически записываете. К счастью, база включает в себя профиль, поэтому мы в порядке.
Ах, да - если вы хотите установить размер буфера и количество буферов, будьте осторожны с тем, для какого сеанса (возможно, для обоих) вы его устанавливаете.
Для получения дополнительной информации, особенно о том, как анализировать следы xperf, см.: https://randomascii.wordpress.com/category/xperf/
Для более простого способа записи трассировок ETW см. Этот интерфейс с открытым исходным кодом для управления записью трассировки - вы можете легко добавить собственного провайдера в записываемый список: https://github.com/google/UIforETW/releases