38просмотров
14 октября 2025 г.
📷 ФотоScore: 42
🔍 Linux: трассировка системных и библиотечных вызовов Когда программа «зависает», «не пишет в файл» или «не может подключиться» — первое, что делает опытный инженер: смотрит, что она делает на уровне ядра и библиотек. Для этого в Linux есть мощные инструменты трассировки. Разбираем, как и зачем их использовать. 📌 Системные вызовы vs библиотечные вызовы - Системные вызовы (syscalls) — прямой интерфейс между userspace и ядром: open, read, write, fork, execve, socket, connect и т.д.
- Библиотечные вызовы — функции из glibc (например, fopen, printf, malloc), которые могут, но не обязаны вызывать ядро. > 💡 Например: malloc() выделяет память в userspace и не делает syscall, пока не исчерпает локальный пул. 🛠 strace — трассировка системных вызовов Показывает все syscalls, которые делает процесс. strace ls /tmp Полезно, чтобы:
- Увидеть, какие файлы открывает программа,
- Найти ошибку Permission denied или No such file,
- Отследить сетевые подключения (socket, connect, sendto). 📌 Советы по использованию: Подключиться к уже запущенному процессу — strace -p <PID>. Фильтровать только нужные вызовы — strace -e trace=openat. Сохранить вывод в файл — strace -o log.txt. 🛠 ltrace — трассировка библиотечных вызовов Показывает вызовы динамических библиотек, в первую очередь glibc. ltrace cat /etc/hostname Вы увидите такие функции, как fopen(), fread(), printf(), malloc() и free(). ⚠️ Работает только с программами, использующими динамические библиотеки — а это подавляющее большинство в Linux. 🆚 Когда что использовать? Если программа не может открыть файл — запускайте strace и ищите вызовы вроде openat с ошибками. Если нужно понять, читает ли приложение данные — смотрите read() или recv() через strace. При подозрении на утечку памяти — ltrace покажет, как часто вызываются malloc и free. Хотите проверить, использует ли приложение DNS? Используйте strace, чтобы увидеть подключение к порту 53, или ltrace — чтобы поймать вызов getaddrinfo. 🧪 Пример: почему ping не работает? strace ping -c1 8.8.8.8 2>&1 | grep -E "(socket|connect|send|recv)" Вы увидите, создаётся ли raw-сокет, отправляется ли ICMP-пакет и приходит ли ответ. Если в выводе появляется socket(...) = -1 EPERM, значит, у процесса нет прав на создание raw-сокета — даже без root ping может не работать! 🔮 Современные альтернативы Существуют и более продвинутые инструменты: - perf — для профилирования на уровне ядра, - bpftrace и BCC — для эффективной трассировки с помощью eBPF, без накладных расходов ptrace, - Готовые утилиты вроде opensnoop и execsnoop из набора BCC — чтобы отслеживать открытие файлов и запуск процессов. Но strace и ltrace по-прежнему остаются быстрыми, простыми и доступными в любом дистрибутиве. 💡 Итог - strace помогает заглянуть внутрь взаимодействия программы с ядром, - ltrace раскрывает работу с библиотеками в userspace, - Вместе они дают полную картину поведения любого приложения. Это must-have навык для DevOps, SRE, системных администраторов и разработчиков. #Linux #Debug #Sysadmin #Devops #СистемноеАдминистрирование #strace #ltrace #SystemCalls #Glibc #Userspace #LinuxTips #IT #Программирование #OpenSource