Ftrace
дамп огромен. Он сбрасывает журналы для каждого процесса, а мне нужна только информация для моей программы и ее потоков. Фильтр Ftrace
может работать только на PID
s. Но мне нужны имена процессов (иначе, comm
s). Так что это лучшее, что я мог сделать без перекомпиляции ядра.
Я использовал Systemtap
со следующим скриптом:
sudo stap -e 'probe scheduler.process_exit {if (execname() == "evince"){printf("%s, %lu\n", execname(), task_current()->se->sum_exec_runtime)}}'
scheduler.process_exit()
- это пробная точка из Systemtap
tapset библиотека, которая внутренне перехватывает функцию ядра do_exit()
(я использовал первую, потому что она кажется более переносимой). execname()
возвращает имя процесса, а task_current()
возвращает задачу для текущего контекста. se
( планируемый объект для планировщика) - это поле в task_struct
(структура данных, связанная с процессом или потоком в Linux), а sum_exec_runtime
показывает всего физическое время выполнения планируемой сущности.
Итак, вот что делает сценарий:
При каждом выходе процесса (или потока) он проверяет, соответствует ли имя процесс (или поток) - evince . В этом случае будет отображаться общее время выполнения (в наносекундах) evince (потому что мы находимся в контексте процесса evince перед выходом ).
Очевидно, это не самое портативное решение.