Действительно структурированный вывод в strace (Эльвира Хабирова, OSSDEVCONF-2016) — различия между версиями
Материал из 0x1.tv
StasFomin (обсуждение | вклад) |
StasFomin (обсуждение | вклад) (Batch edit: replace PCRE (\n\n)+(\n) with \2) |
||
(не показано 19 промежуточных версий этого же участника) | |||
Вывод <tt>strace</tt> на данный момент нацелен на человекочитаемость и по этой причине тяжело поддается автоматической обработке. Кроме того, из-за отсутствия единой системы вывода в выводе могут присутствовать неточности, что еще сильнее усложняет задачу. Поэтому в рамках GSoC 2016 проблема автоматической обработки была решена разработкой такой единой системы. Как результат, стало возможным легко встраивать не только подсистемы любого формата вывода, но и дополнительные слои логики. </blockquote> == Видео == {{vimeoembed|185219718|800|450}} {{youtubelink|I6k57JL4qvo}}{{letscomment}} == Слайды == \centering
\begin{scriptsize}
\begin{verbatim}accept4(3, {sa_family=AF_UNIX, sun_path="accept4.socket.connect"}, [110->25],
SOCK_NONBLOCK|SOCK_CLOEXEC) = 5\end{verbatim}
\end{scriptsize}
\squeeze
\caption{Пример отображения информации о системном вызове \EN{\emph{accept4}}}\label{fig:accept4}
\squeeze
\end{figure}
\EN{\emph{accept4}} принимает
в качестве второго аргумента указатель на
структуру \EN{\emph{struct sockaddr}}, в качестве третьего~--- размер структуры
аргумента, и в качестве четвертого набор фагов. В данном случае
\EN{\emph{strace}} скопировал из \EN{tracee} структуру \EN{\emph{struct
sockaddr}} и декодировал её согласно значению поля \EN{\emph{sa\_family}}
(т.~е. интерпретировал последующие данные как поле \EN{\emph{sun\_path}}); также
\EN{\emph{strace}} прочитал
значение по указателю, переданному в аргументе \EN{\emph{addrlen}}, причём и | 00000 33 34 35 36 37 34567 | * 7 bytes in buffer 2 | 00000 38 39 61 62 63 64 65 89abcde |\end{verbatim} \end{scriptsize} \squeeze \caption{Пример отображения информации о системном вызове \EN{\emph{pwritev}} с печатью содержимого \EN{iovec}}\label{fig:pwritev} \squeeze \end{figure} \begin{itemize} \item[--] Строки и массивы, если их размер превышает указанный в параметре \texttt{-s} (32 по умолчанию), сокращаются и терминируются многоточиями. \item[--] Для I/O вызовов существует возможность, посредством задания опции \texttt{-ewrite=1}/\texttt{-eread=1}, вывода содержимого данных, передаваемых в этих вызовах, в формате шестнадцатеричного дампа. \end{itemize} На следующей иллюстрации заметим нестандартный способ аббревиирования вывода массива переменных, который отличается от используемого в большинстве других системных вызовов многоточия. \begin{figure}[h!] \centering \begin{small} \begin{verbatim}execve("./execve", ["./execve"], [/* 41 vars */]) = 0\end{verbatim} \end{small} \squeeze \caption{Пример отображения информации о системном вызове \EN{\emph{execve}}}\label{fig:execve} \squeeze \end{figure} На следующей иллюстрации показан пример системного вызова \EN{\emph{prctl}}. \begin{figure}[h!] \centering \begin{small} \begin{verbatim}prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, {len=3, filter=[BPF_STMT(BPF_LD|BPF_W|BPF_ABS, 0), BPF_JUMP(BPF_JMP|BPF_K|BPF_JEQ, 0x3, 0, 0x1), BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW)]}) = 0\end{verbatim} \end{small} \begin{figure}[h!] \centering \begin{small} \begin{verbatim}rt_sigprocmask(SIG_SETMASK, NULL, [HUP INT QUIT ALRM TERM], 8) = 0\end{verbatim} \end{small} \squeeze \caption{Пример отображения информации о системном вызове \EN{\emph{rt\_setsigprocmask}}}\label{fig:rt_setsigprocmask} \squeeze \end{figure} </latex> === Идея структурированного вывода === <latex> Итак, количество техник вывода, применяемых в \EN{\emph{strace}}, с одной стороны, велико и разнообразно (вывод битовых масок, масок сигналов, различные варианты аббревиирования структур), с другой, всё же поддаётся классификации (есть некие общие правила вывода структур, указателей, массивов). В основе структурированного вывода лежит идея, что все особенности формата вывода можно оформить в виде \EN{reusable} примитивов и использовать для вывода только их. Пример преобразования декодера показан на иллюстрации: </latex> [[File:strace-lp0-conversion.svg|center]] Второй важной особенностью является введение промежуточного представления системного вызова: [[File:strace-scheme.svg|center]] <latex> Декодер заполняет это внутреннее представление, и оно может потом быть выведено независимо. %На данный момент код, выводящий его в определенном %формате, называется \EN{formatter}. Переход к структурированному выводу позволяет избежать многочисленных однотипных вызовов печати (запятые, скобки, знаки равенства) и связанных с этим потенциальных багов. Разделение процесса декодирования и вывода позволяет внедрить возможности, которые ранее были затруднительны в реализована базовая проверка, является ли вывод в формате \EN{JSON} корректным \EN{JSON} (проверка на отсутствие остатков непосредственных вызовов функций печати). Регулярно производится \EN{\texttt{git rebase}} на \EN{master}-ветку \EN{\emph{strace}}. Из несделанного~--- помимо оставшихся декодеров системных вызовов\footnote{Среди которых можно отметить системный вызов \EN{\emph{ioctl}}.}~--- отсутствие тестов для формата \EN{JSON}. Прогресс разработки можно отслеживать в соответствующем репозитории~\cite{structured-repo}. \begin{thebibliography}{9} \bibitem{pcapng} PcapNg draft specification \url{https://github.com/pcapng/pcapng} \bibitem{readme-structured} \EN{Structured output readme.} \url{https://github.com/lineprinter/strace/blob/structured/README-structured.md} \bibitem{structured-repo} \EN{Structured output branch repository.} \url{https://github.com/lineprinter/strace/tree/structured} \end{thebibliography} </latex> == Примечания и отзывы == <!-- <blockquote>[©]</blockquote> --> {{fblink|1782184895367857}} {{vklink|206}} <references/> [[File:{{#setmainimage:Действительно структурированный вывод в strace (Эльвира Хабирова, OSSDEVCONF-2016)!.jpg}}|center|640px]] {{stats|disqus_comments=0|refresh_time=2018-05-15T17:11:482021-08-31T16:58:03.810735923790|vimeo_comments=0|vimeo_plays=456|youtube_comments=0|youtube_plays=4159}} [[Категория:OSSDEVCONF-2016]] [[Категория:Strace]] |
Текущая версия на 12:20, 4 сентября 2021
Содержание
Аннотация
- Докладчик
- Эльвира Хабирова
strace — утилита для отладки программ. Она отображает сделанные отлаживаемым процессом tracee системные вызовы, пришедшие ему сигналы, изменения его состояния и пр.
Вывод strace на данный момент нацелен на человекочитаемость и по этой причине тяжело поддается автоматической обработке.
Кроме того, из-за отсутствия единой системы вывода в выводе могут присутствовать неточности, что еще сильнее усложняет задачу.
Поэтому в рамках GSoC 2016 проблема автоматической обработки была решена разработкой такой единой системы.
Как результат, стало возможным легко встраивать не только подсистемы любого формата вывода, но и дополнительные слои логики.
Видео
Посмотрели доклад? Понравился? Напишите комментарий! Не согласны? Тем более напишите.
Слайды
Расширенные тезисы
Обзор проблемы
Идея структурированного вывода
Второй важной особенностью является введение промежуточного представления системного вызова:
Текущее состояние
Примечания и отзывы
Plays:115 Comments:0