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

Введение

Strace — это утилита, которая отслеживает системные вызовы, которые представляют собой механизм трансляции, обеспечивающий интерфейс между процессом и операционной системой (ядром). Эти вызовы могут быть перехвачены и прочитаны. Это позволяет лучше понять, что процесс пытается сделать в заданное время.
Перехватывая эти вызовы, мы можем добиться лучшего понимания поведения процессов, особенно если что-то идет не так. Функциональность операционной системы, позволяющая отслеживать системные вызовы, называется ptrace. Strace вызывает ptrace и читает данные о поведении процесса, возвращая отчет.
Сегодня мы изучим, когда нужно использовать strace, как ее использовать, как интерпретировать вывод программы, как находить ошибки в выводе strace и быстро и эффективно решать возникающие проблемы.

Состояния процесса в Linux

Когда процесс передает ядру запрос, который не может быть исполнен сразу же, то процесс «погружается в сон/ожидание» и «пробуждается», когда запрос может быть удовлетворен. В связи с этим, в зависимости от текущей ситуации, процесс, во время своего выполнения, может переходить из одного состояния в другое:

Рассмотрим основные состояния процесса:

   Выполнение — процесс либо запущен (текущий процесс в системе), либо готов к запуску (ожидает передачи на выполнение процессору).

   Ожидание — процесс ожидает наступления некоторого события (пользовательского ввода, сигнала от другого процесса и т.п.) или выделения системных ресурсов. Кроме того, ядро также различает два типа ожидающих процессов:

   прерываемые ожидающие процессы — могут быть прерваны сигналами;

   непрерываемые ожидающие процессы — процессы ожидают непосредственно на аппаратном уровне и не могут быть прерваны каким-либо событием/сигналом.

   Завершен — процесс был остановлен, как правило, путем получения сигнала штатного завершения работы exit().

   Зомби — иногда, когда родительский процесс убивается до завершения дочернего процесса, дочерние процессы становятся «осиротевшими», при этом в качестве нового родителя (с соответствующим изменением PPID) им назначается процесс init. Убитые процессы, но при этом все еще отображающиеся в таблице процессов, называются процессами зомби (они мертвы и не используются).

Состояние мониторинга процессов под Linux (PSTack and Starce)

s http-equiv=»Content-Type» content=»text/html;charset=UTF-8″>tyle=»clear:both;»>

pstack

PSTack используется для отслеживания стека процесса. Эта команда очень полезна при устранении неисправностей процесса, поэтому мы обнаружили, что служба была в состоянии работы (например, фальшивое состояние, как мертвый цикл), используйте эту команду для простого позиции Проблема; Может быть какое-то время внутри, выполнить несколько PSTack, если стек кода презентации всегда припаркован в том же месте, расположение должно сосредоточиться на, он может иметь проблемы;

Пример: просмотр процедуры стека:

Номер процесса PSTack

В мире Linux процесс не может напрямую получить доступ к аппаратному устройству, и когда процесс должен получить доступ к аппаратному устройству (например, для чтения файлов дисков, получение сетевых данных и т. Д.), ДОЛЖЕН переключаться в режиме пользователя в режим ядра и аппаратное устройство осуществляется через систему. STORCE может отслеживать системный вызов, генерируемый процессом, включая параметры, значения возврата и потребление времени.

Каждая строка — это системный вызов, левая сторона равного знака — это имя функции и его параметры системного вызова, а правая сторона — это возвращаемое значение вызова. Stroace Отображает параметры этих вызовов и возвращает значение символической формы. Stroace получает информацию из ядра и не нужно строить ядро ​​каким-либо особым образом.

Отслеживание исполняемости

Параметр -F -F -F -F рассказывает stroce отслеживать процессы из вилки и VFork, а опция -O Whavy Writes All STRACEOUT.TXT, MSGRECERGE — это программа для начала и отладки.

Программы отслеживания обслуживания

Отслеживайте все системные вызовы для процесса 28979 (Trace = ALL), а также время проведения статистики времени, а также время начала (и отображается в визуальном разделе) и, наконец, существует в результате записи в файле вывода. Отказ

Интеллектуальная рекомендация

19.03.21 Я загрузил комплексные обучающие видеоуроки Photoshop CC 2015 и обучающие видеоуроки по новым функциям PS CC 2015. Я просмотрел несколько видео, но мне кажется, что они в основном объясняют н…

проверка данных весеннего mvc Два способа проверки данных Spring MVC: 1.JSR303 2.Hibernate Validator Второй метод является дополнением к первому методу Шаги для проверки данных с использованием Hibern…

Существует два способа вызова между сервисами Springcloud: RestTemplate и Feign. Здесь мы представляем сервисы вызова RestTemplate. 1. Что такое RestTemplate RestTemplate — это структура веб-запросов …

1. Понимать предварительный, средний, последующий порядок и иерархическую последовательность бинарных деревьев; Свяжите язык C со структурой данных двоичного дерева; Освойте с…

Вам также может понравиться

Последнее обучение, как использовать Kaldi, чтобы проснуться без использования WSTF, поэтому вам нужно глубоко пойти в Kaldi для обучения. Временное состояние обучения. Три изображения представляют со…

Во время простоя некоторые веб-страницы, которые мы создали, не были завершены, но не хотят, чтобы другие видели, вы можете создать простой эффект шифрования страницы на странице этой веб-страницы, ан…

Расширенные статьи серии Zookeeper 1. NIO, ZAB соглашение, 2PC представления концепции 2. Лидер выборов 3. Рукописный распределенный замок, центр настройки ==================================== 1. NIO,…

Посмотрите на конечный эффект первым DemoPreview.gif SETP1 эффект капли воды Первая реакция на эффект капли воды — нарисовать замкнутую кривую. С помощью события MotionEvent измените радиус во время п…

Notes

It is a pity that so much tracing clutter is produced by systems employing shared libraries.

It is instructive to think about system call inputs and outputs as data-flow across the user/kernel boundary. Because user-space and kernel-space are
separate and address-protected, it is sometimes possible to make deductive inferences about process behavior using inputs and outputs as propositions.

In some cases, a system call will differ from the documented behavior or have a different name. For example, on System V-derived systems the true
time(2) system call does not take an argument and the stat function is called xstat and takes an extra leading argument. These
discrepancies are normal but idiosyncratic characteristics of the system call interface and are accounted for by C library wrapper functions.

On some platforms a process that has a system call trace applied to it with the -p option will receive a SIGSTOP . This signal
may interrupt a system call that is not restartable. This may have an unpredictable effect on the process if the process takes no action to restart the system
call.

Команда strace Linux

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

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

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

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

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

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

А теперь разберём примеры strace Linux.

vmstat — статистика памяти

Эта команда показывает подробную информацию о памяти, процессах, страницах памяти, операциях ввода/вывода и нагрузке на процессор.

Цифра три, значит, что информация будет выводиться каждые три секунды. В первом отчете содержится вся информация, накопленная с момента запуска системы, во всех последующих за интервал между вызовами утилиты. С полем memory и swap все понятно, они отображают состояние памяти, куда интереснее следующие поля.

Колонка bi показывает количество операций чтения с диска, а bo — вывода на диск. Колонки us и sy показывают загрузку процессора пользовательскими процессами и процессами системы соответственно, id отображает время простоя в процентах, во время ожидания работы диска. Колонки  si и so отображают количество запросов записи и выгрузки страниц из swap.

Сокращение wa обозначает количество операций ввода/вывода, которые ждут своей очереди. В разделе procs, колонка r показывает количество процессов, ждущих своей очереди для выполнения на процессоре, а колонка b показывает процессы ждущие окончания дисковых операций. В колонке system, in — число выполненных прерываний, cs — число переключения контекста процессора в секунду.

Первые шаги со strace

Мы воспользуемся небольшой программой, чтобы продемонстрировать strace. Он мало что делает: открывает файл и записывает в него строку текста, и в нем нет проверки на ошибки. Это просто быстрый взлом, чтобы у нас было что использовать со strace.

# включить int main (int argc, char argv[]) {// дескриптор файла FILE * fileGeek; // открыть файл с именем «strace_demo.txt» или создать его fileGeek = fopen («strace_demo.txt», «w»); // записываем текст в файл fprintf (fileGeek, «Записываем это в файл»); // закрываем файл fclose (fileGeek); // выход из программы return (0); } // конец основного

Мы сохранили это в файле под названием «file-io.c» и скомпилировали его с помощью gcc в исполняемый файл под названием stex, названный в честь «strace example».

gcc -o stex файл-io.c

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

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

strace ./stex

Мы ясно видим, как системный вызов write отправляет текст «Write this to the file» в наш открытый файл и системный вызов exit_group. Это завершает все потоки в приложении и отправляет возвращаемое значение обратно в оболочку.

КОМАНДА STRACE LINUX

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

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

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

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

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

  • fork – создание нового дочернего процесса;
  • read – попытка читать из файлового дескриптора;
  • write – попытка записи в файловый дескриптор;
  • open – открыть файл для чтения или записи;
  • close – закрыть файл после чтения или записи;
  • chdir – изменить текущую директорию;
  • execve – выполнить исполняемый файл;
  • stat – получить информацию о файле;
  • mknod – создать специальный файл, например, файл устройства или сокет;

А теперь разберём примеры strace Linux.

Типы процессов

В Linux существует три основных типа процессов:

   Процессы переднего плана (или «интерактивные процессы») — они инициализируются и управляются с помощью терминального сеанса. Другими словами, необходимым условием для запуска таких процессов является наличие пользователя, подключенного к системе; они не запускаются автоматически как часть системных функций/служб. Когда команда/процесс выполняется на переднем плане, то они полностью занимают запустивший их терминал. Вы не сможете использовать другие команды, т.к. приглашение оболочки будет недоступно, пока данный процесс выполняется на переднем плане.

   Фоновые процессы (или автоматические процессы») — это процессы, не подключенные к терминалу; они не ожидают пользовательского ввода данных. Таким образом, другие процессы могут выполняться параллельно с процессом, запущенным в фоновом режиме, поскольку им не нужно ждать его завершения.

   Демоны (англ. daemons») — это особый тип фоновых процессов, которые запускаются при старте системы и продолжают работать в виде службы; они не умирают. Такие процессы запускаются как системные задачи (службы). Однако при этом они могут управляться пользователем через init-процесс (о котором мы поговорим чуть позже). Например, к демонам относится служба электронных сообщений sendmail и sshd — служба, принимающая от клиентов запросы на соединения по протоколу ssh. За исключением процесса init и некоторых других, процессы демонов обычно имеют окончание в своем имени.

КОМАНДА STRACE LINUX

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

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

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

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

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

  • fork – создание нового дочернего процесса;
  • read – попытка читать из файлового дескриптора;
  • write – попытка записи в файловый дескриптор;
  • open – открыть файл для чтения или записи;
  • close – закрыть файл после чтения или записи;
  • chdir – изменить текущую директорию;
  • execve – выполнить исполняемый файл;
  • stat – получить информацию о файле;
  • mknod – создать специальный файл, например, файл устройства или сокет;

А теперь разберём примеры strace Linux.

Отслеживание запущенного процесса

Если процесс, который вы хотите отследить, уже запущен, вы все равно можете прикрепить к нему strace. Для этого вам нужно знать идентификатор процесса. Вы можете использовать ps с grep, чтобы найти это. У нас работает Firefox. Чтобы узнать идентификатор процесса firefox, мы можем использовать ps и передать его через grep.

ps -e | grep firefox

Мы видим, что идентификатор процесса — 8483. Мы будем использовать параметр -p (идентификатор процесса), чтобы указать strace, к какому процессу подключиться

Обратите внимание, что вам нужно будет использовать sudo:

sudo strace -p 8483

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

Setuid Installation

If strace is installed setuid to root then the invoking user will be able to attach to and trace processes owned by any user. In addition setuid and
setgid programs will be executed and traced with the correct effective privileges. Since only users trusted with full root privileges should be allowed to do
these things, it only makes sense to install strace as setuid to root when the users who can execute it are restricted to those users who have this
trust. For example, it makes sense to install a special version of strace with mode ‘rwsr-xr—‘, user root and group trace, where members
of the trace group are trusted users. If you do use this feature, please remember to install a non-setuid version of strace for ordinary lusers
to use.

Решение проблемы

Я полагаю, мы получили достаточно информации, чтобы решить ее. Что-то не то со шрифтами. Факт столь долгого запуска приложения говорит о том, что кэш шрифтов создается каждый раз заново, что, в свою очередь, свидетельствует о том, что запущенная пользователем программа не имеет доступа к системному кэшу шрифтов. Это также объясняет, почему при запуске программы с правами root подобной проблемы не наблюдается.
Приложение работает медленно. Логи strace показывают открытые ошибки. Теперь мы можем запустить полную сессию strace и найти точные пути этих ошибок. Мы будем использовать флаг -e для открытых системных вызовов, чтобы сократить вывод, и мы будем увеличивать длину строки используя флаг -s, чтобы получить всю информацию о потерянных путях. Мы хотим узнать о шрифтах, недоступных для чтения пользователем.
Но нам не нужно этого делать, так как эту информацию мы уже получили с помощью ltrace, которая показала, что проблема кроется в чтении шрифтов. Этот библиотечный вызов блокирует создание виджета, поэтому приложение запускается медленно. vmstat обеспечил нас дополнительной информацией, которая помогла сузить круг поиска.
Если мы проверим системный кэш шрифтов, расположенный в /var/cache/fontconfig, мы увидим, что эти шрифты созданы с правами доступа 600, то есть они доступны для чтения только root. Если мы сменим права на 644, мы решим проблему и все наши программы будут запускаться быстро. Кроме того, тем самым мы сэкономим дисковое пространство, так как не будет необходимости создания своей копии шрифтов для каждого пользователя в своей домашней директории.

Trace a Linux process using ps command

Let’s see a real life example that happened days ago in a dedicated server I manage.

 ps -U johndoe -u  johndoe u
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
johndoe 59289 4.0 0.0 43568 9528 ? Ss Jun08 110:01 httpd

As you see, the first thing to find out the process was to use the ps command, as you see below:

ps -U user -u user u

Replace “user” with your real system user.

After that, once you have the suspicious processes listed, use ll command to find out more information using its PID, as seen before:

As you see, the process claims to be “httpd” to hide itself (any process can change its own process-title), it is actually a perl process:

 ll /proc/59289/exe
lrwxrwxrwx 1 johndoe johndoe 0 Jun 10 10:05 /proc/59289/exe -> /usr/bin/perl*

There was no script file associated with it, however. The script was most likely piped into the perl process to avoid putting anything on the filesystem where it would leave a trace.

I do not know how the script came to be running under this user, but this was a vulnerable WordPress installation with many outdated plugins and injected malware that could easily lead to this kind of issues.

Killing the rouge process was the best thing to do in this case:

kill -9 59289

Replace “59289” with the real process ID.

Strace: another easy way to trace a system process

strace is a very handy and useful tool used by system administrators for debugging and diagnostic system and process related problems where the source is not really clear and available when taking a quick and first look.

This debug tool allows programmers and system users to quickly find out how a program is interacting with the OS. It does this by monitoring system calls and signals.

As we will see in the next examples, strace outputs each line in the trace that includes the system call name, its arguments and the return value (inside the parentheses).

strace example

Let’s run strace against /bin/ls, and save the output into a file called ls.txt

strace -o ls.txt /bin/ls

To read the output, just run:

more ls.txt

But that is just a basic strace example. The interesting part comes when you can strace the webserver process and find out what it is doing exactly. Let’s take a php-fpm process as example:

strace -p 18478 -s 80 -o /root/php-fpm.debug.txt
strace -p 18478 -s 80 -o /root/php-fpm.debug.txt
Process 18478 attached
^CProcess 18478 detached

By pressing CTRL + C you will terminate the trace and it will be detached.

Fig 01. Screenshot from strace command example

You can also specify what you need to trace, for example, if you only need to trace the open and read system calls, you should specify that in the strace syntax, as you see below:

strace -e trace=open,read -p 18478 -s 80 -o /root/php-fpm.debug.txt

This quick strace example used a few command options, exaplained here:

-o filename: used to write the strace output into a file name.
-p PID: here you must specify the system process ID.
-s SIZE: sets the maximum string size to print (32 is the default).

Again, to read the output, just run:

more /root/php-fpm.debug.txt

Now you know how to trace a Linux process easily with two simple commands, with this information you can easily track a Linux process to find out what is doing exactly inside your server. strace takes a little bit more of time to understand from the manual, but it’s the definitive tool to trace a Linux process.

Further reading:

  • man strace
  • strace hello world
  • ps command

Отправка вывода в файл

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

Иногда удобнее фиксировать все, искать и прокручивать весь набор результатов

Так вы случайно не исключите ничего важного. Параметр -o (вывод) позволяет отправлять вывод из сеанса strace в текстовый файл

strace -o трассировка-output.txt ./stex

Затем вы можете использовать команду less для прокрутки списка и поиска системных вызовов — или чего-либо еще — по имени.

меньше trace-output.txt

Теперь вы можете использовать все возможности поиска less для исследования результатов.

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

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

strace -o /home/ashep/tmp/strace.log /bin/ls

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

execve("/bin/ls", ["/bin/ls"], ) = 0
brk(0)                                  = 0x9841000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb779e000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=78866, ...}) = 0
mmap2(NULL, 78866, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb778a000
close(3)                                = 0

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

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Мой редактор ОС
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: