Добавить в корзинуПозвонить
Найти в Дзене

strace - смотрим, что процесс делает на самом деле

Бывает, процесс висит, жрёт CPU, но не падает. Логи молчат. Что делать? Танцы с бубном? Нет. Есть strace - утилита, которая показывает все системные вызовы процесса. В Linux любая программа постоянно общается с ядром: читает файлы, пишет в сокеты, выделяет память. strace перехватывает этот диалог и показывает его вам. ➤ Вариант 1 (Прицепиться к работающему процессу): процесс завис, но не умирает. # Прицепиться к PID 1234 strace -p 1234 # Вывод: # read(3, 0x7f8a2c000000, 4096) = -1 ETIMEDOUT (Connection timed out) # Наглядно: процесс ждёт ответа от какого-то файлового дескриптора 3 ➤ Вариант 2 (Запустить программу под strace): нужно понять, почему падает при запуске. # Запускаем и смотрим strace ./my_binary # Ищем строки с -1 (ошибка) strace ./my_binary 2>&1 | grep -1 ➤ Вариант 3 (Фильтрация по конкретным вызовам): шума много, нужно только чтение файлов. # Только open, read, write, close strace -e trace=open,read,write,close ./my_binary # Только сеть strace -e trace=network

strace - смотрим, что процесс делает на самом деле

Бывает, процесс висит, жрёт CPU, но не падает. Логи молчат. Что делать? Танцы с бубном? Нет. Есть strace - утилита, которая показывает все системные вызовы процесса.

В Linux любая программа постоянно общается с ядром: читает файлы, пишет в сокеты, выделяет память. strace перехватывает этот диалог и показывает его вам.

➤ Вариант 1 (Прицепиться к работающему процессу): процесс завис, но не умирает.

# Прицепиться к PID 1234

strace -p 1234

# Вывод:

# read(3, 0x7f8a2c000000, 4096) = -1 ETIMEDOUT (Connection timed out)

# Наглядно: процесс ждёт ответа от какого-то файлового дескриптора 3

➤ Вариант 2 (Запустить программу под strace): нужно понять, почему падает при запуске.

# Запускаем и смотрим

strace ./my_binary

# Ищем строки с -1 (ошибка)

strace ./my_binary 2>&1 | grep -1

➤ Вариант 3 (Фильтрация по конкретным вызовам): шума много, нужно только чтение файлов.

# Только open, read, write, close

strace -e trace=open,read,write,close ./my_binary

# Только сеть

strace -e trace=network ./my_binary

➤ Вариант 4 (Сохранить вывод в файл): процесс падает редко, нужно записать всё.

strace -o /tmp/strace.log ./my_binary

➤ Вариант 5 (Замерить время каждого вызова): где программа тормозит?

# -T показывает время выполнения каждого вызова

strace -T -e trace=read ./my_binary

# -c — сводная статистика в конце

strace -c ./my_binary

Когда strace бесполезен:

- Процесс тормозит, но не из-за системных вызовов (например, алгоритм O(n²))

- Проблема в самом ядре (туда уже нужен perf или trace-cmd)

- Программа работает с графикой/звуком через прямые вызовы драйверов

P.S. strace может влиять на производительность процесса в 10-100 раз. На проде прицепляйтесь аккуратно и ненадолго.

👉🏻 Я в Telegram - https://dzen.ru/id/686102a27e39653c3429f77f

👉🏻 Я в VK - vk.com/helcode

👉🏻 Я на Boosty - boosty.to/helcode