Утилита strace в GNU/Linux

Утилита strace в GNU/Linux

Утилита strace в Linux

Полное руководство для начинающих

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

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


Что такое strace?

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

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


Основной синтаксис команды strace

Основной синтаксис команды strace следующий:

strace [опции] [команда]

Если не указана команда, strace отслеживает системные вызовы для уже запущенного процесса. Например, чтобы отслеживать выполнение команды ls, просто укажите:

strace ls

Если необходимо отслеживать уже запущенный процесс, нужно указать его идентификатор процесса (PID) с помощью опции -p:

strace -p 

Основные опции утилиты strace

1. -e — фильтрация системных вызовов

Опция -e позволяет фильтровать вывод по системным вызовам. Например, чтобы отслеживать только системные вызовы, связанные с файлами (например, open, read, write), используйте:

strace -e trace=file ls

Также можно фильтровать по типам системных вызовов, например:

strace -e trace=process

Для отображения только системных вызовов open:

strace -e open ls

2. -o — вывод в файл

Для сохранения вывода в файл используйте опцию -o, указав имя файла:

strace -o output.txt ls

Теперь весь вывод будет сохранен в файле output.txt вместо вывода в терминал.

3. -p — отслеживание уже запущенного процесса

Чтобы отслеживать системные вызовы для уже запущенного процесса, используйте опцию -p, указав PID процесса:

strace -p 12345

Вместо 12345 нужно указать идентификатор процесса, который можно получить с помощью команды ps.

4. -f — отслеживание дочерних процессов

Когда запускается новый процесс (например, при вызове fork), strace по умолчанию отслеживает только родительский процесс. Чтобы отслеживать также и дочерние процессы, используйте опцию -f:

strace -f ls

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

5. -tt — вывод времени

Если вы хотите видеть точное время выполнения каждого системного вызова, используйте флаг -tt. Это полезно для анализа производительности и временных задержек:

strace -tt ls

Примеры использования strace

Пример 1: Отслеживание командной строки

Для отслеживания выполнения программы ls используйте:

strace ls

В выводе будет много информации о системных вызовах. Например, вы увидите вызовы open, read, close, которые программа выполняет для получения списка файлов в текущем каталоге.

Пример 2: Отслеживание работы с файлами

Чтобы отследить только операции с файлами, используйте фильтрацию по системным вызовам:

strace -e trace=file cat /etc/passwd

Этот пример отслеживает все действия, связанные с открытием и чтением файла /etc/passwd.

Пример 3: Отслеживание процесса с помощью PID

Если процесс уже запущен, можно отслеживать его системные вызовы, указав PID:

strace -p 12345

Замените 12345 на настоящий PID процесса. Это полезно для анализа работы уже запущенных приложений.

Пример 4: Сохранение вывода в файл

Для записи вывода в файл используйте опцию -o:

strace -o output.txt ls

Теперь все системные вызовы будут записаны в файл output.txt, а не отображены в терминале.

Пример 5: Отслеживание работы команды cd

Команда cd изменяет текущий рабочий каталог в оболочке, но strace может отслеживать системные вызовы, которые происходят при изменении каталога. Для этого запустите strace с командой cd:

strace cd /home/username

Однако, стоит отметить, что команда cd является встроенной в оболочку командой (встроенная команда shell), и она не запускает новый процесс, а изменяет текущий каталог внутри оболочки. Поэтому при выполнении strace на cd не будет видно системных вызовов, связанных с изменением каталога.

Чтобы увидеть системные вызовы, выполните команду strace в сочетании с оболочкой (например, bash), которая вызовет команду cd:

strace bash -c "cd /home/username"

После выполнения команды strace отобразится вывод с системными вызовами. Например, вы увидите вызов chdir, который отвечает за изменение каталога. Вот как может выглядеть вывод:


execve("/bin/bash", ["bash", "-c", "cd /home/username"], [/* 60 vars */]) = 0
...
chdir("/home/username")                 = 0
...

Здесь chdir("/home/username") — это системный вызов, который фактически изменяет текущий рабочий каталог в оболочке.

Объяснение:

  • execve("/bin/bash"): Запуск новой оболочки Bash с аргументами.
  • chdir("/home/username"): Это системный вызов, который меняет текущий каталог в процессе оболочки на указанный путь.

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


Практические задания с использованием strace

Задание 1: Отслеживание системных вызовов при запуске программы

Запустите команду strace ls и внимательно изучите вывод. Найдите, какие системные вызовы выполняются в процессе работы программы. Какие файлы она открывает? Какие операции выполняются над этими файлами?

Задание 2: Анализ ошибок программы

Попробуйте запустить команду strace ls /nonexistent_directory. Изучите вывод, чтобы увидеть, какие ошибки возникают при попытке открыть несуществующий каталог. Это задание поможет вам понять, как использовать strace для диагностики ошибок программ.

Задание 3: Отслеживание работы программы с сетью

Запустите strace для программы, которая работает с сетью, например, curl, и отслеживайте системные вызовы, связанные с сетью:

strace -e trace=network curl http://example.com

Посмотрите, какие системные вызовы выполняются при установлении сетевого соединения и получении данных.

Задание 4: Отслеживание сессий пользователя

Запустите команду strace -f -e trace=process bash, чтобы отслеживать запуск процессов в сессии bash. Проанализируйте, как происходят системные вызовы fork, execve, wait при создании новых процессов.


Заключение

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

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

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

Ключевые слова: strace, отладка программ, системные вызовы, диагностика программ в Linux, инструменты для отладки в Linux, диагностика ошибок, производительность программ.

Может быть интересно

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

Мы используем cookie-файлы, чтобы обеспечить вам лучшую навигацию по нашему веб-сайту. Для получения более подробной информации нажмите на ссылку «Политика конфиденциальности персональных данных». Если вы продолжите навигацию по этому веб-сайту, вы дадите разрешение на использование cookie-файлов.

Напишите нам, если нашли ошибку в тесте

Мы обязательно  ответим Вам и дадим подробные комментарии!