Поиск по сайту:

Как использовать 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.