Книга: Программирование для Linux. Профессиональный подход
8.1. Команда strace
8.1. Команда strace
Прежде чем изучать системные вызовы, полезно познакомиться с командой strace
, которая отслеживает выполнение заданной программы, выводя список всех запрашиваемых системных вызовов и получаемых сигналов. Эта команда ставится в начале строки вызова программы, например:[26]
% strace hostname
В результате будет получено несколько экранов выходной информации. Каждая строка соответствует одному системному вызову. В строке указываются имя вызова, его аргументы (или их сокращенные обозначения, если аргументы слишком длинные) и возвращаемое значение. По возможности команда strace
старается отображать не числовые значения, а символические константы. Показываются также поля структур, переданных по указателю. Вызовы обычных функций не регистрируются.
В случае команды strace hostname
первая строка сообщает о системном вызове execve()
, загружающем программу hostname
:[27]
execve("/bin/hostname", ["hostname"], [/* 49 vars */]) = 0
Первый аргумент — это имя запускаемой программы. За ним идет список аргументов, состоящий из одного элемента. Дальше указан список переменных среды, который команда strace
опустила для краткости.
Следующие примерно 30 строк отражают работу механизма загрузки стандартной библиотеки языка С из библиотечного файла. Ближе к концу наконец встречаются системные вызовы, связанные непосредственно с работой программы. Системный вызов uname()
запрашивает имя компьютера у ядра:
uname({sys="Linux", node="myhostname", ...}) = 0
Заметьте, что команда strace показала метки полей структуры, в которой хранятся аргументы. Эта структура заполняется в системном вызове: Linux помещает в поле sys
имя операционной системы, а в поле node — имя компьютера. Функция uname()
будет описана ниже, в разделе 8.15. "Функция uname()".
Системный вызов write()
выводит полученные результаты на экран. Вспомните, что дескриптор 1 соответствует стандартному выходному потоку. Третий аргумент — это количество отображаемых символов. Функция возвращает число действительно записанных символов.
write(1, "myhostnamen", 11) = 11
Эта строка может отобразиться искаженной, поскольку вывод программы hostname
смешивается с результатами работы команды strace
. Если запускаемая программа создает слишком много выходных данных, лучше перенаправить вывод команды strace
в файл с помощью опции -о имя_файла
.
- 8.1. Команда strace
- 8.2. Функция access(): проверка прав доступа к файлу
- 8.3. Функция fcntl(): блокировки и другие операции над файлами
- 8.4. Функции fsync() и fdatasync(): очистка дисковых буферов
- 8.5. Функции getrlimit() и setrlimit(): лимиты ресурсов
- 8.6. Функция getrusage(): статистика процессов
- 8.7, Функция gettimeofday(): системные часы
- 8.8. Семейство функций mlock(): блокирование физической памяти
- 8.9. Функция mprotect(): задание прав доступа к памяти
- 8.10. Функция nanosleep(): высокоточная пауза
- 8.11. Функция readlink(): чтение символических ссылок
- 8.12. Функция sendfile(): быстрая передача данных
- 8.13. Функция setitimer(): задание интервальных таймеров
- 8.14. Функция sysinfo(): получение системной статистики
- 8.15. Функция uname()
- 5.4 Команда trap: обработка прерываний
- Scrum-команда: состав
- Команда make и make-файлы
- 21.3.1. Команда arch — вывод архитектуры компьютера
- Глава 4 Контент + команда = SMM
- Команда break в Python:
- 13.4.1. strace
- 13.4.2. strace Variations
- Близость между командами разработчиков и эксплуатации в компании Sparkle Corp
- Рабочая группа, она же руководящая команда
- 1.11 Справочник по наиболее употребительным стандартным командам ОС
- Команда test