← Назад к вопросам

Что такое strace в Linux?

1.8 Middle🔥 171 комментариев
#Linux и администрирование

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое strace в Linux?

strace — это мощнейший диагностический и отладочный инструмент в Linux, который позволяет отслеживать взаимодействие между процессом и ядром операционной системой. По своей сути, strace является трассировщиком системных вызовов (system call tracer). Он перехватывает и записывает все системные вызовы, которые делает целевая программа, а также сигналы, получаемые этим процессом.

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

Ключевые возможности и применение strace

  • Отладка и диагностика сбоев: Когда программа падает, завершается с неясной ошибкой или "зависает", strace часто является первым инструментом для анализа. Он покажет, на каком именно системном вызове программа остановилась (например, ошибка EACCES на вызове open() из-за недостатка прав).
  • Профилирование производительности: Можно выявить "узкие места" — системные вызовы, на которые программа тратит несоразмерно много времени (с помощью ключа -c для статистики или -T для отображения времени, затраченного на каждый вызов).
  • Анализ поведения неизвестных программ: Позволяет понять, что делает бинарный файл: к каким файлам обращается, с какими сетевыми портами работает, какие другие программы запускает.
  • Расследование проблем с файлами и сетью: Прямо видны пути к файлам, дескрипторы, сетевые адреса (IP, порты), что критично при проблемах с конфигурацией, доступом или подключением.
  • Изучение зависимостей: Можно увидеть, какие разделяемые библиотеки (*.so) пытается загрузить программа при старте.

Основы синтаксиса и примеры использования

Запуск трассировки с самого начала работы программы:

strace ls -l /home

Подключение к уже работающему процессу по его PID (очень полезно для "зависших" процессов):

strace -p 12345

Сохранить подробный вывод трассировки в файл для последующего анализа:

strace -o ls_trace.log ls -l

Показать статистику по системным вызовам после завершения программы (профилирование):

strace -c ls -l

Пример вывода strace (упрощенно):

execve("/bin/ls", ["ls", "-l"], 0x7ffd... /* 23 vars */) = 0
brk(NULL)                               = 0x55a...
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (Нет такого файла или каталога)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=..., ...}) = 0
mmap(NULL, ..., PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f...
close(3)                                = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF...", 832)              = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=..., ...}) = 0
mmap(NULL, ..., PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f...
...
getdents(3, /* 5 entries */, 32768)     = 144
write(1, "total 12\ndrwxr-xr-x 2 user use"..., 98) = 98
close(3)                                = 0

Как читать вывод:

  • Слева — имя системного вызова (например, openat, read, write) и его аргументы.
  • Справа после = — возвращаемое значение. -1 обычно указывает на ошибку, и тогда рядом выводится код ошибки (ENOENT, EACCES) и его текстовое описание.

Важные флаги и фильтрация

Поскольку вывод strace может быть очень объемным, существуют ключи для фильтрации:

  • -e trace=<категория>: Трассировать только определенные типы вызовов.
    strace -e trace=file ls -l    # Только вызовы, связанные с файлами
    strace -e trace=network curl example.com # Только сетевые вызовы
    strace -e trace=process ssh localhost # Только вызовы, связанные с процессами
    
  • -e trace=<имя_системного_вызова>: Трассировать только конкретные вызовы (например, open, connect, execve).
  • -f: Трассировать также и дочерние процессы, созданные форком (крайне важно для многопоточных приложений или скриптов, запускающих другие команды).
  • -s <размер>: Увеличить максимальный размер строки аргументов (по умолчанию 32 символа, что часто обрезает полезную информацию).
  • -v: Выводить более подробную (verbose) информацию о структурах данных.

Ограничения и аналоги

  • Производительность: strace существенно замедляет работу трассируемой программы, так как ядро останавливает процесс на каждом системном вызове для генерации вывода. Нельзя использовать в production для длительного мониторинга высоконагруженных сервисов.
  • Безопасность: Запуск strace требует прав, эквивалентных правам целевого процесса. Для трассировки процессов других пользователей обычно нужны права root (sudo).
  • Альтернативы:
    *   **ltrace:** Трассирует вызовы библиотечных функций (не только системных вызовов).
    *   **perf trace:** Инструмент на основе подсистемы `perf_events` ядра Linux, обладает меньшими накладными расходами и более богатыми возможностями фильтрации и анализа.
    *   **bpftrace/eBPF:** Современная технология трассировки ядра с минимальным impact на производительность, позволяющая создавать сложные фильтры и агрегации на лету.

В арсенале DevOps-инженера и системного администратора strace — это инструмент первого реагирования при глубокой диагностике проблем на уровне ОС. Его умение "разговаривать" на языке системных вызовов делает невидимые проблемы осязаемыми и понятными.