Как использовать strace для мониторинга системных вызовов Linux
Опубликовано: 2022-01-29 Linux-программы просят ядро что-то сделать за них. Команда strace
выявляет эти системные вызовы. Вы можете использовать их, чтобы понять, как работают программы и почему иногда они не работают.
Ядро и системные вызовы
Какими бы умными они ни были, компьютерные программы не могут делать все сами. Им нужно делать запросы, чтобы для них выполнялись определенные функции. Эти запросы идут к ядру Linux. Как правило, есть библиотека или другой программный интерфейс, который вызывает программа, и затем библиотека делает соответствующий запрос — называемый системным вызовом — к ядру.
Возможность видеть системные вызовы, сделанные программой, и ответы на них может помочь вам понять внутреннюю работу программ, которые вас интересуют или которые вы написали. Это то, что делает strace
. Это может помочь в устранении неполадок и поиске узких мест.
Это не то же самое, что отладка приложения с помощью такого инструмента, как gdb
. Программа отладки позволяет исследовать внутреннюю работу программы во время ее выполнения. Он позволяет вам пройти через логику вашей программы и проверить память и значения переменных. Для сравнения, strace
информацию о системных вызовах во время работы программы. Когда трассируемая программа завершается, strace
выводит информацию о системном вызове в окно терминала.
Системные вызовы обеспечивают все виды низкоуровневых функций, таких как чтение и запись файлов, завершение процессов и т.д. На справочной странице системных вызовов есть список сотен системных вызовов.
СВЯЗАННЫЕ: Отладка с помощью GDB: начало работы
Установка strace
Если strace
еще не установлен на вашем компьютере, вы можете легко установить его.
В Ubuntu используйте эту команду:
sudo apt установить strace
В Fedora введите следующую команду:
sudo dnf установить strace
На Manjaro команда такая:
sudo pacman -Sy strace
Первые шаги со strace
Мы будем использовать небольшую программу для демонстрации strace
. Он мало что делает: он открывает файл и записывает в него строку текста, и в нем нет проверки ошибок. Это просто быстрый хак, чтобы нам было что использовать со strace
.
#include <stdio.h> int main(int argc, char argv[]) { // дескриптор файла ФАЙЛ *fileGeek; // открыть файл с именем "strace_demo.txt" или создать его fileGeek = fopen("strace_demo.txt", "w"); // пишем текст в файл fprintf(fileGeek, "Запишите это в файл" ); // закрыть файл fclose (fileGeek); // выход из программы возврат (0); } // конец основного
Мы сохранили это в файл с именем «file- io.c » и скомпилировали его с помощью gcc
в исполняемый файл с именем stex
, названный в честь « st race example».
gcc -o stex файл-io.c
Мы вызовем strace
из командной строки и передадим ему имя нашего нового исполняемого файла в качестве процесса, который мы хотим отследить. Мы могли бы так же легко отследить любую из команд Linux или любой другой исполняемый файл. Мы используем нашу крошечную программу по двум причинам.
Первая причина заключается в том, что strace
многословен. Выводов может быть много. Это здорово, когда вы используете strace
в гневе, но поначалу это может быть ошеломляющим. Для нашей крошечной программы существует ограниченный вывод strace
. Вторая причина в том, что наша программа имеет ограниченный функционал, а исходный код короткий и понятный. Это упрощает определение того, какие разделы вывода относятся к различным частям внутренней работы программы.
страйс ./стекс
Мы можем ясно видеть системный вызов write
, отправляющий текст «Записать это в файл» в наш открытый файл, и системный вызов exit_group
. Это завершает все потоки в приложении и отправляет возвращаемое значение обратно в оболочку.
Фильтрация вывода
Даже наша простая демонстрационная программа дает довольно много результатов. Мы можем использовать опцию -e
(выражение). Мы передадим имя системного вызова, который мы хотим видеть.
strace -e написать ./stex
Вы можете сообщить о нескольких системных вызовах, добавив их в список, разделенный запятыми. Не включайте пробелы в список системных вызовов.
strace -e закрыть, написать ./stex
Отправка вывода в файл
Преимущество фильтрации вывода также является проблемой фильтрации вывода. Вы видите то, что просили увидеть, но не видите ничего другого. И некоторые из этих других результатов могут быть более полезными для вас, чем то, что вы просили показать.
Иногда удобнее захватить все, а затем искать и прокручивать весь набор результатов. Так вы случайно не исключите ничего важного. Параметр -o
(вывод) позволяет отправить вывод сеанса strace
в текстовый файл.
strace -o trace-output.txt ./stex
Затем вы можете использовать команду less
для прокрутки списка и поиска системных вызовов или чего-либо еще по имени.
меньше trace-output.txt
Теперь вы можете использовать все возможности поиска less
для изучения вывода.
СВЯЗАННЫЕ С: Как использовать команду less в Linux
Добавление временных меток
Вы можете добавить несколько разных временных меток к выходным данным. Параметр -r
(относительные временные метки) добавляет временные метки, показывающие разницу во времени между началом каждого последующего системного вызова. Обратите внимание, что эти значения времени будут включать время, затраченное на предыдущий системный вызов, и все остальное, что программа делала до следующего системного вызова.
strace -r ./stex
Временные метки отображаются в начале каждой строки вывода.
Чтобы увидеть количество времени, потраченное на каждый системный вызов, используйте параметр -T
(время системного вызова). Это показывает продолжительность времени, проведенного внутри каждого системного вызова.
strace -T ./stex
Продолжительность времени показана в конце каждой строки системного вызова.
Чтобы увидеть время, когда был вызван каждый системный вызов, используйте параметр -tt
(отметки абсолютного времени). Это показывает время «настенных часов» с микросекундным разрешением.
strace -tt ./stex
Время отображается в начале каждой строки.
Отслеживание запущенного процесса
Если процесс, который вы хотите отслеживать, уже запущен, вы все равно можете подключить к нему strace
. Для этого вам нужно знать идентификатор процесса. Вы можете использовать ps
с grep
, чтобы найти это. У нас запущен Firefox. Чтобы узнать идентификатор процесса firefox
, мы можем использовать ps
и передать его через grep
.
пс-е | grep firefox
Мы видим, что идентификатор процесса равен 8483. Мы будем использовать параметр -p
(идентификатор процесса), чтобы сообщить strace
, к какому процессу следует подключиться. Обратите внимание, что вам нужно будет использовать sudo
:
судо страче-p 8483
Вы увидите уведомление о том, что strace
присоединился к процессу, а затем системные вызовы трассировки будут отображаться в окне терминала, как обычно.
Создание отчета
Параметр -c
(только сводка) заставляет strace
печатать отчет. Он создает таблицу для информации о системных вызовах, сделанных отслеживаемой программой.
strace -c ./stex
Столбцы:
- % time : процент времени выполнения, затраченного на каждый системный вызов.
- секунды : общее время, выраженное в секундах и микросекундах, затраченное на каждый системный вызов.
- usecs/call : среднее время в микросекундах, потраченное на каждый системный вызов.
- call : количество раз выполнения каждого системного вызова.
- errors : количество сбоев для каждого системного вызова.
- syscall : имя системного вызова.
Эти значения будут показывать нули для тривиальных программ, которые выполняются и быстро завершаются. Реальные значения показаны для программ, которые делают что-то более значимое, чем наше демонстрационное приложение.
Глубокое понимание, легко
Вывод strace
может показать вам, какие системные вызовы выполняются, какие выполняются повторно и сколько времени выполнения тратится на код на стороне ядра. Это отличная информация. Часто, когда вы пытаетесь понять, что происходит внутри вашего кода, легко забыть, что ваш двоичный файл практически безостановочно взаимодействует с ядром для выполнения многих его функций.
Используя strace
, вы видите полную картину.
Команды Linux | ||
Файлы | tar · pv · cat · tac · chmod · grep · diff · sed · ar · man · pushd · popd · fsck · testdisk · seq · fd · pandoc · cd · $PATH · awk · join · jq · fold · uniq · journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · look · strings · type · rename · zip · unzip · mount · umount · install · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · patch · convert · rclone · shred · srm | |
Процессы | alias · screen · top · nice · renice · progress · strace · systemd · tmux · chsh · history · at · batch · free · which · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · тайм-аут · стена · да · убить · спать · sudo · su · время · groupadd · usermod · группы · lshw · выключение · перезагрузка · halt · poweroff · passwd · lscpu · crontab · дата · bg · fg | |
Сеть | netstat · ping · traceroute · ip · ss · whois · fail2ban · bmon · dig · finger · nmap · ftp · curl · wget · who · whoami · w · iptables · ssh-keygen · ufw |
СВЯЗАННЫЕ С: Лучшие ноутбуки с Linux для разработчиков и энтузиастов