Когда дело доходит до выполнения таких задач, ядро Linux предоставляет такие функции, как ptrace отлаживать и диагностировать процессы.
В этой статье обсуждается, как использовать инструмент strace для отслеживания, мониторинга и отладки процессов, взаимодействующих с ядром.
Что такое системные вызовы?
Прежде чем мы обсудим, как использовать strace, вам нужно понять, что мы ищем и как они работают. Это означает, что мы должны изучить основы системных вызовов Linux.
Системный вызов программный метод, с помощью которого программа может запрашивать службу у ядра системы. Это процесс, который мы будем использовать для проверки действий между пользовательскими процессами и ядром Linux.
Каждый раз, когда пользователь выполняет программу, которая выполняет чтение, запись, уничтожение, выход, привязку и т. Д., запрос, они делают системный вызов. Существует широкий спектр системных вызовов, используемых программами для выполнения различных задач, таких как работа в сети, чтение и запись в файлы, инициализация и завершение процессов и многое другое.
Думайте о системных вызовах как о функциях - они ведут себя одинаково - потому что они могут принимать аргументы и возвращать значения. Основное различие между системными вызовами и нормальной работой заключается в том, что системные вызовы могут напрямую взаимодействовать с ядром. Системные вызовы используют механизм ловушки для перехода между пользовательским пространством и ядром.
В системе Linux этот механизм хорошо скрыт от пользователей такими библиотеками, как Glibc.
ПРИМЕЧАНИЕ: Системные вызовы и взаимодействия с ядром - это гораздо больше, чем то, что мы обсуждали в этом руководстве. Пожалуйста, обратитесь к страницам руководства для получения дополнительной информации.
https: // linkfy.к / syscalls
https: // linkfy.к / trapmanual
Как установить strace в Linux
Хотя инструменты strace по умолчанию не устанавливаются в основных дистрибутивах Linux, они доступны в большинстве официальных репозиториев этих дистрибутивов; вы можете легко установить его, используя менеджеры пакетов по умолчанию.
ПРИМЕЧАНИЕ: Хотя мы не будем рассказывать, как установить strace во всех системах, мы обсудим, как это сделать, с основными менеджерами пакетов, такими как apt, dnf, pacman и yum
1: Установка Debian (apt)
Установите strace с помощью команды:
apt-get install strace -y2. Семейство RedHat (dnf и yum)
Чтобы установить strace с помощью диспетчера пакетов yum, введите команду:
ням установить straceДля диспетчера пакетов dnf введите команду:
dnf установить strace3: Arch Linux (pacman)
Для пользователей Arch Linux вы можете установить strace с помощью команды:
pacman -S straceТеперь, когда у вас установлен и запущен strace, мы можем двигаться дальше и узнать, как использовать
Основное использование Strace: практическое руководство
Давайте обсудим базовое использование strace и поймем основной вывод команды и то, как мы можем ее использовать.
ПРИМЕЧАНИЕ: Выходные данные Strace, такие как имена системных вызовов, соответствующие аргументы и возвращаемые значения, обрабатываются стандартный дескриптор файла ошибок (stderr).
Основной способ использования strace - это вызов утилиты strace с указанием имени программы, поведение которой мы хотим понять.
Вот пример этого с помощью команды ls:
Ух ты! Это большой объем вывода для простой команды, такой как ls.
Хотя мы не можем обсуждать весь вывод команды strace, мы можем выделить и понять ее значение.
Если вы посмотрите на первую строку в выводе выше, вы заметите следующие особенности.
- Имя системного вызова
- Аргументы, переданные системному вызову, заключены в круглые скобки.
- Возвращаемое значение из системного вызова
Следовательно, в первой строке системный вызов - это execve (выполнение программы с использованием указанного массива аргументов), аргументы системного вызова: («/ bin / ls», [«ls», «/»], 0x7fffc4b277a8 / * 13 vars * /) и возвращаемое значение 0.
https: // linkfy.к / execve
Системные вызовы execve выполняют двоичный файл, который мы хотим использовать, в данном случае расположенный в (/ bin / ls), а массив аргументов представляет собой путь, по которому мы хотим перечислить содержимое.
Вы также заметите обозначение, заключенное в косую черту и звездочку. Для нашего примера:
/ * 13 варов * /Приведенный выше вывод указывает количество переменных, добавленных в результате вызова процесса. Доступ к среде внутри функции execv осуществляется с помощью внешней переменной окружения, определенной как:
int main (int argc, char * argv [], char * envp [])Конечный результат - это возвращаемое значение, которое в данном случае равно 0.
Вы также заметите, что большинство строк вывода strace следуют аналогичному шаблону, который мы обсуждали выше.
Как отслеживать определенные системные вызовы
Хотя strace дает много информации о системных вызовах программ, большинство экземпляров обратятся к вам для фильтрации определенных системных вызовов. Для этого мы передаем команде strace флаг -e, за которым следует имя нужного нам системного вызова.
Как насчет просмотра системных вызовов read для команды ls. Например:
strace -e читать ls
Вы заметите, что здесь отображаются только системные вызовы чтения.
Системный вызов read принимает три аргумента: дескриптор файла, буфер и количество байтов. Затем системный вызов считывает количество байтов из переданного аргумента дескриптора файла в буфер.
https: // linkfy.к / readsyscall
Сводка системных вызовов
Strace также позволяет нам получать сводку системных вызовов, выполненных процессом. Передав аргумент -c или -summary-only, мы можем получить результат, подобный показанному ниже:
Команда фильтрует и упорядочивает вывод более эффективно, чем обычный вывод strace. Чтобы получить как сводку, так и обычный вывод strace, передайте аргумент -C.
Как использовать Strace с запущенными процессами
В других случаях вам понадобится трассировка запущенного процесса. До этого момента мы использовали strace только одну команду. Чтобы отследить запущенный процесс, мы можем использовать аргумент -p, за которым следует процесс ID процесса (PID), чтобы присоединить к нему strace.
Вы можете получить PID запущенного процесса, используя top и grep, ps, htop, pidof или другие инструменты системного мониторинга.
Например, чтобы получить PID процесса apache, мы можем использовать:
ps -ax | grep -i apache2Это должно дать вам PID процесса apache2 (в данном случае PID 3514), и мы можем использовать его, чтобы прикрепить его к strace.
Это должно отобразить вывод, аналогичный показанному ниже.
Strace будет постоянно отслеживать присоединенный процесс и показывать вывод, когда присоединенный процесс выполняет системные вызовы. Чтобы завершить трассировку, нажмите CTRL + C, что отключает процесс от strace.
Как сохранить выходные данные Strace в файлы
Мы также можем перенаправить вывод strace в файл в качестве аргумента. Используя флаг -o, за которым следует путь к файлу в качестве аргумента, мы можем сохранить журналы strace.
Например:
strace -p 3514 -o ~ / Рабочий стол / apache_traceПосле сохранения файла вы можете позже отслеживать и анализировать его.
Заключение
В этом руководстве мы узнали, как установить и использовать strace в основных дистрибутивах Linux. Теперь, когда вы понимаете системные вызовы и то, как работают процессы, вы можете использовать strace для мониторинга и отладки запущенного системного процесса.
Концепции, изученные в этом руководстве, очень полезны, в основном потому, что вы можете использовать то, что вы узнали, для отслеживания, если кто-то вмешивается в системные процессы.