Как пользоваться командой strace в Linux

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

Благодаря системным вызовам можно узнать какие файлы использует приложение, сетевой порт, а также что именно ей необходимо для функционирования. Здесь же можно будет найти ошибки, которые возникают у программы. То есть это действительно хороший способ понять, как работает программа и в какой момент возникает ошибка. Все эти преимущества дарит команда Strace в операционной системе Linux. Стоит разобраться, как правильно использовать данную команду и каким образом она работает.

Что такое strace

strace – программа, использующая подсистему ядра ptrace для отслеживания
системных вызовов. Основной недостаток strace – замедление работы приложений, в десятки или даже сотни раз, поэтому в production среде применяйте аккуратно.

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

strace опции команда аргументы

Если рассматривать самый простой вариант, Strace будет запускать указанные команда с помощью аргументов, а также выведет стандартный поток проблем все системные вызовы параметра. Теперь необходимо разобраться в параметрах управления поведения команды:

  • -i — позволяет вывести указатели на инструкция пока производится системный вызов.
  • -k — позволяет вывести стек вызова для того, чтобы отслеживать процессы всех системных вызовов.
  • -o — позволяет вывести все информационные данные о системном вызове не в классический поток проблем, а в отдельные файлы.
  • -q — отключает вывод сообщений о подключении и отключении.
  • -qq — позволяет запретить вывод сообщений о том, что процесс завершился.
  • -r — выводит временные метры для каждого вызова системы.
  • -s — указывает максимальные размеры выводимых строк. По стандарту установлено значение 32.
  • -t — выводит время суток всех вызовов.
  • -tt — добавляет микросекунду к каждому процессу.
  • -T — выводит информацию о длительности системных вызовов.
  • -x — выводит каждую строку в шестнадцатеричной системе.
  • -xx — выводит частично строки в шестнадцатеричной системе.
  • -y — позволяет вывести путь файлового дескриптора.
  • -yy — выводит информацию о протоколах файловых дескрипторов.
  • -c — ведет счет ошибок, вызовов и время на выполнение всех системных вызовов.
  • -O — добавляет определенное количество микросекунд к счетчикам каждого системного вызова.
  • -S — сортирует информационные блоки, которые выводятся с помощью параметра -c.
  • -w — суммирует время между активацией и завершения системных вызовов.
  • -e — позволит фильтровать определенные системные вызовы, а также события.
  • -P — отслеживает исключительно системные вызовы, которые относятся к указанному пути.
  • -v — позволит вывести дополнительные блоки информации.
  • -b — указывается системный вызов обнаружения, после этого трассировка заканчивается.
  • -f — отслеживает прочие процессы, если они были созданы.
  • -ff — если задается параметр -o, то для всех дочерних процессов создаются отдельные файлы.
  • -l — позволит заблокировать реакции после нажатия комбинации горячих клавиш Ctrl+C и Ctrl+Z.
  • -E — добавит переменную окружению для запуска программы.
  • -p — указывает pid процессов, которые используются для подключения.
  • -u — запускает программу от определенного пользователя.

Это самые основные опции процесса strace. Однако для полного использования, необходимо еще дополнительно понять функционирование системных вызовов. Не стоит рассматривать абсолютно все параметры, будет достаточно основных. Вот на что необходимо обратить свое внимание:

  • fork — создает дополнительные процессы.
  • read — совершить попытку прочитать информацию из файловых дескрипторов.
  • write — совершить попытку запись файловый дескриптор.
  • open — откроет файлы для того, чтобы читать или записывать файлы.
  • close — закрывает файлы после того, как будет проведено чтение и запись.
  • chdir — меняет актуальную директорию.
  • execve — выполняет исполняемый файл.
  • stat — получить подробную информацию о файлах.
  • mknod — создаются специальные файлы. Сюда можно отнести файлы устройства или сокета.

Теперь необходимо разобраться в самих примерах.

Как использовать Strace: примеры

Запуск программу

Самый лучший вариант запуска программы — это использовать параметры и имя команда. Сюда можно можно отнести исполняемые файлы утилиты, которую необходимо будет рассматривать. Например:

strace ls

После этого откроется полный список, состоящий из системных вызовов, созданный самой утилитой. Чтобы узнать актуальную версию ядра, необходимо использовать следующий параметр:

имя_системного_вызова (параметр1, параметр2) = результат сообщение

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

Если все прошло так, как необходимо, то после равенства будет располагаться значение ноль или любое другое положительные числовое значение. Если появляется отрицательное значение, то это говорит исключительно о возникновении ошибок. Как правило, все это сопровождается сообщение.

К примеру, можно увидеть следующее сообщение об ошибке:

openat(AT_FDCWD, "/usr/local/cuda-6.5/lib64/tls/x86_64/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)

Именно здесь можно увидеть значение -1 после равенства. Также сообщение говорит о том, что некие файлы не обнаружены. Однако на функционировании программы это совершенно не отражается. Эта программа будет заключаться только на сторонних библиотеках. Основное функционирование утилиты будет выполняться строкой:

  • uname({sysname="Linux", nodename="sergiy-pc1", ...}) = 0

Здесь уже полный порядок, ведь ядро возвращено и после равенства установлено нулевое значение.

Выводы

Можно сделать вывод, что это действительно очень удобная утилита для работы. Она позволит решить подавляющее большинство разнообразных проблем и ошибок в системе или сервере. В материале рассмотрены основные инструменты и другие аспекты, позволяющие начать комфортное использование данной программы. Этого небольшого минимума будет вполне достаточно.