Наблюдение за процессами при помощи strace






strace — это утилита, присутствующая во многих дистрибутивах Linux по умолчанию, которая может использоваться в диагностических, учебных или отладочных целях. При помощи strace вы иной раз можете избавить себя от лишней головной боли, когда необходимо отыскать причину возникающего сбоя, при этом не имея доступа к исходным кодам. Помимо этого, strace может использоваться при отправке багрепортов разработчикам. Используя этот инструмент вы сможете воочию увидеть, что делает программа.


strace — это бесплатная утилита, распространяемая под BSD-лицензией. Изначально она была написана Paul Kranenburg для SunOS и называлась trace. Затем усилиями Branko Lankester она была портирована на Linux, включая поддержку специфики Linux-ядра. Затем, в 1993 году, версии strace для SunOS и Linux были объединены в одну, был добавлен  некоторый функционал truss из SVR4. В итоге получившийся винегрет назвали strace, который теперь работает на многих UNIX-платформах. Сегодня разработкой утилиты занимаются Wichert Akkerman и Roland McGrath.

Запуск

Системный вызов — это своего рода «обращение» программы к ядру ОС с просьбой выполнить то или иное действие. Необходимость в таких вызовах обусловлена тем, что процессы не могут напрямую взаимодействовать с системой (представьте, что было бы, если бы каждая программа, например, выделяла себе сколько угодно памяти или могла читать и писать какие угодно файлы!).

Работа strace заключается в отслеживании того, какие системные вызовы делает указанный процесс, а также какие сигналы он получает. Вообще, возможна ситуация, когда процесс не делает ни одного системного вызова. В этом случае, естественно, strace вам ничего не «отследит».

В общем случае запуск strace выглядит так:

Утилита запустит программу program_name и будет выводить в поток стандартного вывода сообщения о выполняемых системных вызовах. Зачастую засорение стандартного вывода сообщениями трассировки нежелательно, поскольку в нём будет трудно отыскать то, что выводит сам процесс, поэтому лучше перенаправить вывод strace в отдельный файл, который потом анализировать:

Некоторые текстовые редакторы, например Vim, имеют цветовую подсветку вывода strace, что значительно помогает при анализе больших файлов с текстами трассировки.

Ещё, как вариант, можно запускать strace для трассировки уже запущенного процесса. Для этого необходимо знать PID нужного процесса и передать его в качестве параметра опции -p утилиты:

Анализ вывода

Предлагаю попробовать запустить что-нибудь и поглазеть, как strace ведёт себя в реальной жизни. Возьмём одну из наиболее часто используемых программ и посмотрим, что же она делает «за кулисами».

Вывод файла достаточно велик, поэтому здесь не выкладываю. Думаю, кому интересно, сами попробуют на своей системе. Рассмотрим лишь несколько строк в качестве примера.

Структура каждой строки вывода strace следующая. Первым идёт имя системного вызова. Затем в круглых скобках выводится список параметров, переданных вызову. И последним, после знака равенства, отображается код завершения системного вызова. Подробную документацию по каждому системному вызову в случае необходимости можно найти на соответствующих man-страницах второго раздела.

Резюме

strace может оказаться (и оказывается!) весьма полезной утилитой как для программистов, так и для системных администраторов, помогая отыскать причины «падений» или некорректной работы программ с закрытыми или недоступными исходными кодами.




Наблюдение за процессами при помощи strace: 1 комментарий

  1. В большинстве случаев мне просто надо посмотреть, какие файлы открываются при запуске того или иного процесса. Делаю так:

    strace -eopen some_process

Комментарии запрещены.