Strace 2019 (Дмитрий Левин, OSSDEVCONF-2019)
Материал из 0x1.tv
- Докладчик
- Дмитрий Левин
strace — инструмент для отслеживания и влияния на взаимодействия пользовательских процессов и ядра Linux: системных вызовов, сигналов и изменений состояния процесса. За минувший год в strace реализовано много нового и интересного.
Содержание
Видео
Презентация
Thesis
Введение
strace как инструмент мониторинга взаимодействия пользовательских процессов с ядром существует уже почти 28 лет и широко применяется для диагностики, отладки и изучения поведения ПО. Многочисленные параметры управления фильтрацией дают возможность пользователю strace легко и гибко настраивать отображение системных вызовов и сигналов. С каждым выпуском strace таких возможностей становится больше, а точность отображения — выше.
Начиная с версии 4.13, выпущенной в июле 2016 года, расписание выпусков новых версий strace синхронизировано с расписанием выпусков новых версий ядра linux. Таким образом новые интерфейсы, добавляемые в релизы ядра linux, сопровождаются соответствующими парсерами, добавляемыми в релизы strace.
Помимо многочисленных улучшений отображения системных вызовов, за минувший год в strace было реализовано много нового и интересного.
seccomp-assisted system call filtering
В strace версии 5.3, выпущенной в сентябре 2019 года, реализована фильтрация системных вызовов с помощью интерфейса seccomp ядра linux. При указании параметра -n
strace автоматически создаёт bpf-программу для фильтрации системных вызовов. Такой способ фильтрации снижает на два порядка накладные расходы обработки тех системных вызовов, которые не подлежат трассировке.
System call return status filtering
В strace версии 5.2, выпущенной в июле 2019 года, добавлена фильтрация системных вызовов по коду возврата:
- общий случай:
strace -e status=set
- только завершившиеся успешно:
strace -z
- только завершившиеся неудачно:
strace -Z
Поддержка интерфейса PTRACE_GET_SYSCALL_INFO
В strace версии 4.26, выпущенной в декабре 2018 года, реализована поддержка нового интерфейса PTRACE_GET_SYSCALL_INFO ядра linux, который позволяет надежно различать 64-битные и 32-битные системные вызовы на архитектуре x86-64. strace переключается на использование этого интерфейса автоматически, если ядро linux его поддерживает. Интерфейс PTRACE_GET_SYSCALL_INFO доступен в ядре linux начиная с версии 5.3.
Поддержка новых системных вызовов
Множество системных вызовов, для которых реализованы детальные парсеры, расширено и соответствует ядру linux версии 5.3, включая в себя новые системные вызовы:
- 5.3
- pidfd_open, clone3
- 5.2
- open_tree, move_mount, fsopen, fsconfig, fsmount, fspick
- 5.1
- clock_gettime64, clock_settime64, clock_adjtime64, clock_getres_time64, clock_nanosleep_time64, timer_gettime64, timer_settime64, timerfd_gettime64, timerfd_settime64, utimensat_time64, pselect6_time64, ppoll_time64, io_pgetevents_time64, recvmmsg_time64, mq_timedsend_time64, mq_timedreceive_time64, semtimedop_time64, rt_sigtimedwait_time64, futex_time64, sched_rr_get_interval_time64, pidfd_send_signal, io_uring_setup, io_uring_enter, io_uring_register
Лицензия
Условия распространения strace изменились с permissive на copyleft.
Так, исходный код тестов strace, с помощью которого, помимо всего прочего, было найдено множество ошибок в ядре linux и других проектах, теперь распространяется на условиях GNU General Public License v2+.
Остальная часть strace распространяется на условиях GNU Lesser General Public License v2.1+.
- Modern strace (Дмитрий Левин, OSSDEVCONF-2018)
- Strace — новые возможности (Дмитрий Левин, OSSDEVCONF-2017)
- Can strace make you fail? (Дмитрий Левин, OSSDEVCONF-2016)