Действительно структурированный вывод в strace (Эльвира Хабирова, OSSDEVCONF-2016) — различия между версиями

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

(Batch edit: replace PCRE (\n\n)+(\n) with \2)
 
(не показано 18 промежуточных версий этого же участника)
Вывод <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

Аннотация

Докладчик
Эльвира Хабирова.jpg
Эльвира Хабирова

strace — утилита для отладки программ. Она отображает сделанные отлаживаемым процессом tracee системные вызовы, пришедшие ему сигналы, изменения его состояния и пр.

Вывод strace на данный момент нацелен на человекочитаемость и по этой причине тяжело поддается автоматической обработке.

Кроме того, из-за отсутствия единой системы вывода в выводе могут присутствовать неточности, что еще сильнее усложняет задачу.

Поэтому в рамках GSoC 2016 проблема автоматической обработки была решена разработкой такой единой системы.

Как результат, стало возможным легко встраивать не только подсистемы любого формата вывода, но и дополнительные слои логики.

Видео

on youtube

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

Слайды

Действительно структурированный вывод в strace (Эльвира Хабирова, OSSDEVCONF-2016).pdf Действительно структурированный вывод в strace (Эльвира Хабирова, OSSDEVCONF-2016).pdf Действительно структурированный вывод в strace (Эльвира Хабирова, OSSDEVCONF-2016).pdf Действительно структурированный вывод в strace (Эльвира Хабирова, OSSDEVCONF-2016).pdf Действительно структурированный вывод в strace (Эльвира Хабирова, OSSDEVCONF-2016).pdf Действительно структурированный вывод в strace (Эльвира Хабирова, OSSDEVCONF-2016).pdf Действительно структурированный вывод в strace (Эльвира Хабирова, OSSDEVCONF-2016).pdf Действительно структурированный вывод в strace (Эльвира Хабирова, OSSDEVCONF-2016).pdf Действительно структурированный вывод в strace (Эльвира Хабирова, OSSDEVCONF-2016).pdf Действительно структурированный вывод в strace (Эльвира Хабирова, OSSDEVCONF-2016).pdf Действительно структурированный вывод в strace (Эльвира Хабирова, OSSDEVCONF-2016).pdf Действительно структурированный вывод в strace (Эльвира Хабирова, OSSDEVCONF-2016).pdf Действительно структурированный вывод в strace (Эльвира Хабирова, OSSDEVCONF-2016).pdf Действительно структурированный вывод в strace (Эльвира Хабирова, OSSDEVCONF-2016).pdf Действительно структурированный вывод в strace (Эльвира Хабирова, OSSDEVCONF-2016).pdf Действительно структурированный вывод в strace (Эльвира Хабирова, OSSDEVCONF-2016).pdf Действительно структурированный вывод в strace (Эльвира Хабирова, OSSDEVCONF-2016).pdf Действительно структурированный вывод в strace (Эльвира Хабирова, OSSDEVCONF-2016).pdf Действительно структурированный вывод в strace (Эльвира Хабирова, OSSDEVCONF-2016).pdf Действительно структурированный вывод в strace (Эльвира Хабирова, OSSDEVCONF-2016).pdf Действительно структурированный вывод в strace (Эльвира Хабирова, OSSDEVCONF-2016).pdf

Расширенные тезисы

Обзор проблемы


Идея структурированного вывода

Strace-lp0-conversion.svg

Второй важной особенностью является введение промежуточного представления системного вызова:

Strace-scheme.svg

Текущее состояние


Примечания и отзывы

Действительно структурированный вывод в strace (Эльвира Хабирова, OSSDEVCONF-2016)!.jpg

Plays:115   Comments:0