Гид по технологиям

Как использовать strace для трассировки программ в Linux

• 7 min read • Linux • Обновлено 24 Nov 2025
Как использовать strace в Linux
Как использовать strace в Linux

TL;DR

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

Диаграмма: обзор процесса трассировки strace

Быстрые ссылки

  • Что такое 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

Вывод 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

  1. Подготовка
    • Снимите текущее поведение приложения и лог ошибок.
    • Определите, выполняется ли приложение локально или на сервере (права root?).
  2. Запуск с минимальной фильтрацией
    • strace -f -o /tmp/trace.log ./app arg1 arg2
    • Если лог слишком большой, ограничьте набор: -e trace=file
  3. Поиск очевидных ошибок
    • Поиск ENOENT (файлы не найдены), EACCES (отказ в доступе), ENOMEM (мало памяти), EIO (ошибки ввода/вывода).
  4. Уточнение
    • Включите временные метки: -t или -T, чтобы увидеть длительность операций.
    • Увеличьте -s если аргументы обрезаются.
  5. Анализ
    • Ищите последовательности: open → read → write → close и ошибки между ними.
    • Если проблема связана с сетью, отфильтруйте syscalls для sockets.
  6. Корректировка
    • Попробуйте запустить приложение с исправленными правами/отсутствующими библиотеками.
  7. Валидация
    • Повторите 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, а затем сужайте поиск с помощью фильтров и временных меток.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро