Strace — новые возможности (Дмитрий Левин, OSSDEVCONF-2017)

Материал из 0x1.tv

Докладчик
Дмитрий Левин.jpg
Дмитрий Левин

Strace — инструмент для отслеживания и влияния на взаимодействия пользовательских процессов и ядра Linux: системных вызовов, сигналов и изменений состояния процесса.

За минувший год в strace реализовано много нового и интересного.

Видео

on youtube

Посмотрели доклад? Понравился? Напишите комментарий! Не согласны? Тем более напишите.

Презентация

Strace — новые возможности (Дмитрий Левин, OSSDEVCONF-2017).pdf Strace — новые возможности (Дмитрий Левин, OSSDEVCONF-2017).pdf Strace — новые возможности (Дмитрий Левин, OSSDEVCONF-2017).pdf Strace — новые возможности (Дмитрий Левин, OSSDEVCONF-2017).pdf Strace — новые возможности (Дмитрий Левин, OSSDEVCONF-2017).pdf Strace — новые возможности (Дмитрий Левин, OSSDEVCONF-2017).pdf Strace — новые возможности (Дмитрий Левин, OSSDEVCONF-2017).pdf Strace — новые возможности (Дмитрий Левин, OSSDEVCONF-2017).pdf Strace — новые возможности (Дмитрий Левин, OSSDEVCONF-2017).pdf Strace — новые возможности (Дмитрий Левин, OSSDEVCONF-2017).pdf Strace — новые возможности (Дмитрий Левин, OSSDEVCONF-2017).pdf Strace — новые возможности (Дмитрий Левин, OSSDEVCONF-2017).pdf Strace — новые возможности (Дмитрий Левин, OSSDEVCONF-2017).pdf Strace — новые возможности (Дмитрий Левин, OSSDEVCONF-2017).pdf Strace — новые возможности (Дмитрий Левин, OSSDEVCONF-2017).pdf

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, предназначенной для получения разнообразной информации о системных вызовых. Подробнее об этом расскажет автор в своём докладе.

Примечания и ссылки

Strace — новые возможности (Дмитрий Левин, OSSDEVCONF-2017)!.jpg

Plays:254   Comments:0