Вопрос проверяет знание инструментов трассировки системных вызовов в Linux, что необходимо для отладки и анализа производительности приложений.
Системные вызовы — это интерфейс между пользовательскими программами и ядром Linux. Когда программа хочет выполнить привилегированное действие (например, чтение файла или создание процесса), она обращается к ядру через системный вызов. Отслеживание этих вызовов помогает диагностировать проблемы производительности, ошибки ввода-вывода или неожиданное поведение приложения.
Основной инструмент для трассировки — strace. Он запускает процесс или подключается к уже работающему и выводит все системные вызовы в реальном времени. Пример базового использования:
strace ls -l /tmpЭта команда покажет все системные вызовы, которые выполняет ls при выводе содержимого каталога /tmp. Вывод может быть очень подробным, поэтому часто используют фильтры.
Чтобы сократить вывод, можно использовать опцию -e для фильтрации по типу вызова. Например, отследить только операции с файлами:
strace -e trace=open,read,write ls -l /tmpДля подключения к уже запущенному процессу по его PID используется -p:
strace -p 1234Полезные опции: -c для подсчёта статистики вызовов, -o file для записи в файл, -t для добавления временных меток.
Допустим, программа не может открыть конфигурационный файл. Запустим её под strace и найдём ошибку:
strace -e trace=open myapp 2>&1 | grep configВ выводе будет видно, какой путь пытается открыть программа и с каким результатом (например, ENOENT — файл не найден).
Strace — незаменимый инструмент для отладки и анализа системных вызовов в Linux. Его стоит применять, когда нужно понять, как программа взаимодействует с ядром, особенно при поиске проблем с файлами, сетью или производительностью.