Как использовать strace для трассировки системных вызовов и сигналов

Отслеживание компьютерной программы доступно не только тем, у кого есть исходный код, кто может его прочитать и умеет пользоваться отладчиком. Любой пользователь Linux может отслеживать исполняемый файл с помощью strace. Выясни как!
Что такое стрэйс?
strace — это утилита Linux, которая позволяет вам отслеживать системные вызовы, которые делает данное приложение. Он также улавливает сигналы и производит подробный вывод всей информации, которую он наблюдает.
Новичок в трассировке и трассировке в целом может спросить, почему это полезно. Профессиональный ИТ-инженер может спросить, сколько информации на самом деле может получить strace, особенно если он знает, сколько информации можно просмотреть с помощью отладчика, такого как GDB.
Если вас интересует отладка компьютерного кода и программ, ознакомьтесь с нашей статьей Отладка с помощью GDB: Начало работы.
В обоих случаях есть хорошие новости! Отслеживание всех системных вызовов и сигналов дает исчерпывающую картину работы программы и является отличным средством устранения неполадок и даже отладки. Кроме того, он запускается во время выполнения (как процесс-оболочка), но может легко отслеживаться в файле журнала и позволяет легко усваивать обзор действий программы.
По сравнению с GDB, который также является процессом-оболочкой, все существенно отличается. Например, в GDB можно отслеживать программу шаг за шагом (например, одну строку кода за раз или логический блок кода — или используя точки останова в коде). Однако такие шаги выполняются во время выполнения, тогда как strace просто запускает программу целиком до тех пор, пока не произойдет какая-либо ошибка или до завершения.
Затем инженер или пользователь может пойти и проанализировать полный (текстовый) журнал, найти интересные строки и т. д. Кроме того, GDB позволит также видеть сигналы и системные вызовы, хотя настройка и анализ того же самого — это гораздо больше. сложнее, чем с strace
.
С помощью strace вы можете просто выполнить программу под strace
(т. е. strace some_program
), и хотя это примерно то же самое, что и GDB, операция значительно отличается, как описано выше.
Что же касается объема информации, которую можно получить из трассировки, то неплохо бы сделать шаг назад и вспомнить, откуда берется большинство проблем с компьютером — переполнен диск, исчерпана память, не найден какой-то файл, неверный ввод и т. д.
strace
особенно хорош в области доступа к диску. Поскольку он записывает все системные вызовы, каждый доступ к диску хорошо виден в журнале. Опять же, вы можете искать соответствующие текстовые строки и имена файлов, хотя имейте в виду, что иногда длина строк может быть уменьшена, поэтому может быть виден только частичный вывод.
Таким образом, если бы нам пришлось оценивать strace
как инструмент отладки и/или устранения неполадок и отводить ему место в более новом или более опытном пользовательском наборе инструментов Linux, то в обоих случаях ответ был бы примерно посередине, хотя больше склоняюсь к устранению неполадок, чем к отладке. Далее давайте установим strace
.
Установка strace
Чтобы установить strace в свой дистрибутив Linux на основе Debian/Apt (например, Ubuntu и Mint), выполните следующую команду в своем терминале:
sudo apt install strace
Чтобы установить strace в свой дистрибутив Linux на основе RedHat/Yum (например, RHEL, Centos и Fedora), выполните следующую команду в своем терминале:
sudo yum установить strace
Использование strace
После установки strace
начать работу довольно просто. Мы можем, например, отследить команду/утилиту Linux sleep
:
strace sleep 1

Вывод немедленно подтверждает сделанное выше утверждение. Существует множество информации обо всех действиях, предпринимаемых (очень) простой командой sleep 1
, которая, в конце концов, спит всего одну секунду.
Давайте посмотрим на несколько вещей, которые мы можем наблюдать сразу:
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
Мы видим, что вскоре после запуска программа попыталась получить доступ (на диске) к файлу /etc/ld.so.preload
. Мы также видим, что это не удалось (-1 статус
), так как файл не был найден (ENOENT
) с описательным сообщением об ошибке Нет такого файла или каталога
.
Только эта единственная строка вывода может привести к дальнейшим исследованиям. Например, мы можем просканировать нашу любимую поисковую систему на предмет того, что представляет собой файл /etc/ld.so.preload
и что происходит, когда программа не может его найти, а также как мы может установить его.
Как видите, если вы запустите более сложную программу/программу под strace
, вы можете обнаружить, что она пытается получить доступ к файлу, например, к общему .so
. библиотека — и не могу ее найти. Его легко проанализировать и, скорее всего, легко исправить благодаря strace
.
Далее мы видим, что двоичный кеш conf.d
успешно открывается как только для чтения (O_RDONLY
) с флагом close-on-exec ( используется в многопоточных программах, чтобы избежать состояния гонки) установлен флаг O_CLOEXEC
:
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
Даже если вы не знаете, что означает каждый элемент, простой поиск в Интернете быстро предоставит информацию по каждому конкретному термину или слову, помогая понять представленную информацию и то, что происходит.
Также особый интерес представляет эта строка ближе к концу:
+++ exited with 0 +++
Это означает, что программа завершилась успешно с кодом выхода 0
. Код выхода 0 обычно указывает на успешное выполнение и завершение программ Linux.
Как видно из приведенных выше примеров, легко понять, что делает программа, используя strace
. Каждая строка и даже каждое слово в каждой строке могут быть проанализированы, и часто требуется поисковая система, чтобы пролить свет. Однако даже беглого взгляда на вывод сбойной программы может быть достаточно, чтобы найти точную причину и исправить ее, особенно когда, например, отсутствует требуемый файл и т. д.
Трассировка дочерних процессов
При использовании strace
иногда может показаться, что strace
неправильно отслеживает все системные вызовы программы и т. д. Это может быть просто потому, что отслеживаемая программа инициирована/запущена. ряд дочерних процессов, например, путем разветвления дочерних процессов.
Включить эти дочерние процессы в захват strace очень просто: просто добавьте параметр -f
в командную строку (т. е. strace -f your_program
), и все системные вызовы, д., все дочерние процессы также будут отслеживаться.
Подведение итогов
В этой статье мы обсудили инструмент strace
, который можно использовать для отслеживания любой программы или приложения, работающего на компьютере под управлением Linux.
После установки инструмента мы можем просто и напрямую запустить программу под strace
и наслаждаться высоким уровнем информации об устранении неполадок и отладке, которую нам предоставит оболочка strace
.