Как использовать strace для трассировки программ в Linux
TL;DR
strace — это утилита для трассировки системных вызовов и сигналов процессов в Linux. Она помогает быстро находить ошибки, связанные с доступом к файлам, библиотекам и ресурсам, и отлично подходит для расследования проблем при выполнении программ. Используйте strace с флагом -f для отслеживания дочерних процессов и сохраняйте вывод в файл для последующего анализа.

Быстрые ссылки
- Что такое strace?
- Установка strace
- Базовое использование
- Трассировка дочерних процессов
- Полезные флаги и шаблоны
- Когда strace не помогает
- Альтернативы и доп. инструменты
- Плейбук для отладки
- Чеклист и критерии приёмки
- Короткая шпаргалка
- Заключение
Что такое strace?
strace — это командная утилита для Linux, которая показывает все системные вызовы (system calls) и сигналы, выполняемые процессом. Кратко: системный вызов — способ, которым программа обращается к ядру ОС для работы с файлами, сетью, памятью и т. п.
strace запускает программу и перехватывает её взаимодействие с ядром. В выводе вы увидите открытие файлов, чтение, запись, создание сокетов, изменение прав, завершение процессов и сигналы (например, SIGSEGV). Это дает текстовый журнал, который легко анализировать, искать по строкам и делиться с коллегами.
Почему это полезно:
- Быстро показывает причину ошибок, связанных с отсутствием файлов, библиотек или прав доступа.
- Помогает найти узкие места ввода-вывода и обращения к диску.
- Иногда быстрее и проще в использовании, чем интерактивная отладка в GDB.
Отличие от GDB: GDB позволяет по шагам анализировать код и состояние памяти; strace — просматривать «внешние» взаимодействия программы с системой. Оба инструмента дополняют друг друга.
Установка strace
Для Debian/Ubuntu/Mint:
sudo apt install straceДля RHEL/CentOS/Fedora:
sudo yum install straceПроверка версии:
strace -VБазовое использование
Самая простая команда — запустить приложение под контролем strace:
strace some_programПример с утилитой sleep:
strace sleep 1
Ключевые моменты в выводе:
- access(“/etc/ld.so.preload”, R_OK) = -1 ENOENT (No such file or directory)
- Программа пыталась открыть файл, но он отсутствует. ENOENT — типичная ошибка «файл не найден».
- openat(AT_FDCWD, “/etc/ld.so.cache”, O_RDONLY|O_CLOEXEC) = 3
- Открытие кэша динамических библиотек успешно.
- +++ exited with 0 +++
- Завершение с кодом 0 — успешное выполнение.
Даже простая строка может подсказать направление дальнейшего расследования. Например, отсутствие /etc/ld.so.preload может указывать на проблему в конфигурации динамических загрузчиков.
Полезные флаги и шаблоны
- -o
— сохранить вывод в файл: strace -o trace.log prog - -f — трассировать дочерние процессы (fork/clone)
- -ff — при использовании с -o создаёт файл вывода для каждого процесса (trace.
) - -e trace=
— фильтровать набор системных вызовов, например: -e trace=open,read,write - -e trace=file — только операции с файлами
- -e trace=network — операции сети
- -s
— увеличить длину отображаемых строк (строковые аргументы обрезаются по умолчанию) - -p
— присоединиться к уже запущенному процессу - -t — добавлять временные метки (время вызова)
- -T — показывать длительность каждого вызова
- -x — выводить строки в шестнадцатеричном виде
Примеры:
Сохранить в лог и включить дочерние процессы:
strace -f -o /tmp/mytrace.log ./my_appТрассировать только операции с файлами и увеличить длину строк до 200:
strace -e trace=file -s 200 -o filetrace.log ./my_appПрисоединиться к PID 1234:
sudo strace -p 1234 -s 100 -o attach.logВажно: для присоединения к процессу, запущенному другим пользователем, требуются права root.
Трассировка дочерних процессов
Если приложение создаёт дочерние процессы (fork/clone/exec), то по умолчанию strace не будет прослеживать их, если явно не указать флаг -f. Рекомендуется всегда использовать -f при отладке сложных приложений.
- strace -f ./server
- strace -ff -o trace ./server # создаст серии файлов trace.
Когда strace не поможет
strace очень полезен, но имеет ограничения:
- Не показывает исходный код или значения переменных в пользовательской памяти. Для этого нужен GDB.
- Не всегда помогает с проблемами логики приложения, если ошибка внутри алгоритма и не вызывает системных вызовов с видимым эффектом.
- Нагруженные системы: трассировка интенсивно сетевых/дисковых процессов может создавать огромный объём логов и влиять на производительность.
- Взаимодействие с зашифрованными/сжатые данными: содержимое аргументов может быть нечитабельным.
Когда не хватает возможностей strace, подумайте о комбинировании инструментов (ниже).
Альтернативы и дополняющие инструменты
- GDB — пошаговая отладка и просмотр памяти.
- ltrace — трассировка вызовов библиотечных функций (например, libc), а не системных вызовов.
- perf — профилирование производительности и hotspot-анализ.
- SystemTap и bpftrace — мощные инструменты для системного мониторинга и динамического трассирования (подойдут для продакшн-анализа без сильного вмешательства).
- auditd — встроенная система аудита для контроля доступа и безопасности.
Выбор зависит от цели: если нужно понять «как программа взаимодействует с системой» — используйте strace; если нужно понять «что делает код внутри» — GDB; если нужна производительность — perf.
Плейбук: шаги для расследования ошибки с помощью strace
- Подготовка
- Снимите текущее поведение приложения и лог ошибок.
- Определите, выполняется ли приложение локально или на сервере (права root?).
- Запуск с минимальной фильтрацией
- strace -f -o /tmp/trace.log ./app arg1 arg2
- Если лог слишком большой, ограничьте набор: -e trace=file
- Поиск очевидных ошибок
- Поиск ENOENT (файлы не найдены), EACCES (отказ в доступе), ENOMEM (мало памяти), EIO (ошибки ввода/вывода).
- Уточнение
- Включите временные метки: -t или -T, чтобы увидеть длительность операций.
- Увеличьте -s если аргументы обрезаются.
- Анализ
- Ищите последовательности: open → read → write → close и ошибки между ними.
- Если проблема связана с сетью, отфильтруйте syscalls для sockets.
- Корректировка
- Попробуйте запустить приложение с исправленными правами/отсутствующими библиотеками.
- Валидация
- Повторите strace, убедитесь, что предыдущая ошибка исчезла.
Чеклист для ролей
Разработчик:
- Запусти strace локально и сохрани лог.
- Проверь ENOENT/EACCES/ENOMEM в логах.
- Сверься с зависимостями библиотеки (ldd).
Системный администратор:
- Проверь права файлов и SELinux/auditd.
- Используй -p для живых процессов на сервере.
- Следи за объёмом логов на диске при длительной трассировке.
Инженер поддержки:
- Сохрани вывод strace и приложи его к тикету.
- Укажи версию strace и дистрибутива.
Критерии приёмки
- Программа больше не выдаёт ENOENT или EACCES для критичных файлов.
- Время отклика/операции (при профилировании) улучшилось или стало в пределах ожидаемого.
- Записанный лог не показывает повторяющихся фатальных ошибок в системных вызовах.
Шпаргалка — часто используемые вызовы и их смысл
- open/openat — открыть файл или ресурс
- read/write — чтение/запись данных
- stat/fstat/lstat — получение информации о файле
- execve — запуск новой программы
- fork/clone — создание дочернего процесса
- connect/accept/sendto/recvfrom — операции сети
- mmap/munmap — сопоставление памяти
- brk/sbrk — изменение размера кучи
Примеры сценариев и типовые решения
Сценарий: приложение вылетает с ошибкой «файл не найден». Действия:
- Запусти strace -e trace=file -o file.log ./app
- Найди ENOENT и определите, какой путь искался.
- Исправь путь или установи отсутствующий файл/пакет.
Сценарий: медленная работа из-за интенсивных операций на диск. Действия:
- strace -T -o perf.log ./app
- Посмотри длительность вызовов read/write
- Оптимизируй буферизацию или перемести данные на более быстрый накопитель.
Безопасность и конфиденциальность
Вывод strace может содержать аргументы командной строки, пути к файлам и иногда фрагменты конфиденциальных данных. Не публикуйте логи публично без фильтрации. Для обмена с другими специалистами удалите или маскируйте пароли, токены и личные данные.
Короткая справка по отладке в продакшне
- Не оставляйте длительную трассировку на продакшне без необходимости — она может создавать нагрузку и большой объём логов.
- Используйте таргетированную фильтрацию (-e trace=…) и ограничьте размер аргументов (-s).
- Для кратковременного присоединения к критичному процессу используйте -p и создавайте ротацию логов.
Заключение
strace — надёжный и относительно простой инструмент для понимания того, как программа взаимодействует с системой. Он особенно хорош для выявления проблем доступа к файлам и библиотекам, а также для быстрой диагностики системных ошибок. В комбинации с GDB, perf и современными трассерами (bpftrace, SystemTap) strace занимает важное место в наборе инструментов инженера.
Важное: всегда сохраняйте вывод и минимизируйте публикацию чувствительных данных. Начинайте с простого: strace -f -o trace.log ./app, а затем сужайте поиск с помощью фильтров и временных меток.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента