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 - t.me/helcode
👉🏻 Я в VK - vk.com/helcode
👉🏻 Я на Boosty - boosty.to/helcode
Бывает, процесс висит, жрёт 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 - t.me/helcode
👉🏻 Я в VK - vk.com/helcode
👉🏻 Я на Boosty - boosty.to/helcode