Утилита strace в GNU/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, диагностика ошибок, производительность программ.