Strace — новые возможности (Дмитрий Левин, OSSDEVCONF-2017)
- Докладчик
- Дмитрий Левин
Strace — инструмент для отслеживания и влияния на взаимодействия пользовательских процессов и ядра Linux: системных вызовов, сигналов и изменений состояния процесса.
За минувший год в strace реализовано много нового и интересного.
Содержание
Видео
Посмотрели доклад? Понравился? Напишите комментарий! Не согласны? Тем более напишите.
Презентация
Thesis
Введение
strace как инструмент мониторинга взаимодействия пользовательских процессов с ядром существует уже почти 26 лет и широко применяется для диагностики, отладки и изучения поведения ПО. Многочисленные параметры управления фильтрацией дают возможность пользователю strace легко и гибко настраивать отображение системных вызовов и сигналов. С каждым выпуском strace таких возможностей становится больше, а точность отображения — выше.
Начиная с версии 4.13, выпущенной летом прошлого года, расписание выпусков новых версий strace синхронизировано с расписанием выпусков новых версий ядра linux. Таким образом новые интерфейсы, добавляемые в релизы ядра linux, сопровождаются соответствующими парсерами, добавляемыми в релизы strace.
Помимо многочисленных улучшений отображения системных вызовов, за минувший год в strace было реализовано много нового и интересного.
System Call Specification
Синтаксис описания множества системных вызовов существенно расширился:
- В описании имён системных вызовов теперь поддерживаются регулярные выражения:
strace -e trace=/regexp
- В описании множества системных вызовов поддерживаются описания, которым не соответствует ни одного системного вызова:
strace -e trace=?set
- Имена классов системных вызовов теперь начинаются с префикса %:
strace -e trace=%class \\
Прежний способ именования классов без префикса % ещё поддерживается, но уже считается устаревшим.
- Добавлены новые классы системных вызовов:
- %stat
- stat, stat64, oldstat и их вариации;
- %lstat
- lstat, lstat64, oldlstat и их вариации;
- %fstat
- fstat, fstat64, fstatat64, newfstatat, oldfstat и их вариации;
- %%stat
- stat, lstat, fstat, fstatat, statx и их вариации;
- %statfs
- эквивалент /\textasciicircum(.*_)?statv?fs;
- %fstatfs
- эквивалент /fstatv?fs;
- %statfs
- эквивалент /statv?fs|fsstat|ustat.
System call tampering и fault injection
Механизм syscall fault injection, прототип которого подробно рассматривался на этой конференции год назад, был доработан и включён в strace, начиная с версии 4.15, выпущенной в декабре прошлого года. По сравнению с прототипом, синтаксис syscall fault injection изменился и выглядит следующим образом:
-e fault=set[:error=errno][:when=expr]
Начиная с версии 4.16, выпущенной в феврале прошлого года, реализован более общий механизм вмешательства в системные вызовы, который, помимо syscall fault injection, позволяет осуществлять syscall return value injection и signal injection. Интерфейс этого нового механизма выглядит следующим образом:
-e inject=set[:error=errno|:retval=value][:signal=sig][:when=expr]
Netlink socket parsers
В strace версии 4.19, выпущенной в начале сентября, реализовано детальное декодирование трафика, проходящего через netlink sockets, что позволяет использовать strace для отладки приложений, работающих с netlink-протоколами. Так, например, может выглядеть вывод парсера трафика семейства NETLINK_ROUTE:
Advanced syscall filtering syntax
В рамках GSoC 2017 Николай Марчук реализовал прототип ещё более гибкого синтаксиса фильтрации системных вызовов:
[action</b>(]<b>filter_expression</b>[;<b>arg1</b>[;<b>arg2</b>...]][)]
где
- action
- это <b>trace, abbrev, verbose, raw, read, write, fault, inject, или stacktrace;
- arnN
- это аргументы action</b>;
- filter_expression
- состоит из комбинации фильтров, каждый их которых, в свою очередь, состоит из имени фильтра и аргументов фильтра.
Поддерживаются следующие фильтры:
- syscall set
- множество системных вызовов, соответствующих описанию <b>set</b>.
- fd fd1…
- множество системных вызовов, оперирующих дескрипторами, соответствующими описанию <b>fd1</b>…;
- path path
- множество системных вызовов, оперирующих файлами, соответствующими описанию <b>path</b>.
Комбинация фильтров осуществляется с помощью операторов <b>not, and, or и круглых скобок.
Более подробно новый синтаксис описан в strace(1).
Advanced syscall tampering and filtering with Lua/LuaJIT
В рамках GSoC 2017 Виктор Крапивенский реализовал прототип Lua-скриптинга, который позволяет не только производить фильтрацию и подмену системных вызовов с большей гибкостью, но и производить success injection с сохранением семантики системного вызова, которая, в частности, может заключаться в записи определённых данных в адресное пространство процесса. Подробнее об этом расскажет автор в своём докладе.
Advanced syscall information tool
В рамках GSoC 2017 Эдгар Казиахмедов реализовал прототип новой утилиты asinfo, предназначенной для получения разнообразной информации о системных вызовых. Подробнее об этом расскажет автор в своём докладе.
Примечания и ссылки
Plays:254 Comments:0