Когда программы, работающие в Linux, хотят использовать ресурсы, которыми управляет операционная система (чтение файлов, создание процессов и т. д.), они выполняют системные вызовы ОС. Системные вызовы работают на уровне ядра и выполняют необходимые операции, оставляя управление вызывающей программе. Инструмент strace позволяет отслеживать эти системные вызовы в Linux.

Типичное использование команды strace

Чтобы отслеживать системные вызовы приложения, просто вызовите команду с помощью стрейс в следующем формате:

трассировка ls /tmp

Однако часто бывают процессы, которые запускаются намного раньше и продолжают работать в фоновом режиме. Из-за каких-либо проблем вы можете захотеть собрать дополнительную информацию, связанную с такими процессами. Вы можете прикрепить стрейс любому запущенному приложению, передав идентификатор процесса процессу -п параметр:

стрейс -p 2759

Выход:

Следите за потоками и ответвлениями приложения

С помощью strace вы можете проверить все потоки и другие дочерние процессы, являющиеся ответвлением приложения, с помощью -f флаг.

instagram viewer
стрейс -f -p 2759

Выход:

Проверка некоторых системных вызовов с помощью strace

Вывод strace по умолчанию иногда может быть довольно переполнен. Если вы хотите отслеживать только определенные системные вызовы, вы можете сделать это с помощью параметр:

strace -f -e trace=открыть, записать, закрыть, подключить,Выбрать -п 19770

Чтобы отслеживать только системные вызовы, связанные с файловыми операциями, используйте -e трассировка=файл:

strace -e trace=файл -p 19770

Чтобы отфильтровать только системные вызовы, связанные с сетью, укажите -e трассировка=сеть в команде:

strace -e trace=сеть -p 19770

Получить информацию о времени в секундах

При выводе системных вызовов вы можете использовать для получения информации о времени с точностью до секунд. В большинстве случаев точности будет недостаточно для ваших нужд. В таких ситуациях можно использовать -тт параметр для получения информации о времени с микросекундной точностью:

strace -tt ls /tmp

Собирать статистику о системных вызовах

С параметр, вы можете собирать статистику о системных вызовах сколь угодно долго:

стрэйс -ф -с -р 19770

Сохранить журналы в файл

Если вы запускаете strace в течение длительного времени и хотите более подробно изучить полученные журналы позже, вам необходимо сохранить журналы. С можно указать файл, в котором strace должен сохранять логи:

strace -f -o /tmp/strace.log -e trace=файл ls /tmp

Процесс блокировки ptrace

Используя системный вызов prctl, любое приложение под Linux может предотвратить управление собой пользователями без полномочий root с помощью ptrace. Если приложение очищает PR_SET_DUMPABLE флаг для себя через prctl, пользователи, отличные от root, не смогут управлять этим приложением с помощью ptrace, даже если у них есть право сигнализировать приложению.

Одно из наиболее типичных применений этой функции можно увидеть в программном обеспечении агента аутентификации OpenSSH. Таким образом, управление приложением другим приложением с проследить предотвращается при аутентификации пользователя.

ptrace и безопасность

Благодаря функции ptrace, установленной в традиционной модели процесса Linux, любое программное обеспечение, которое вы запускаете в своей системе вместе с вашим пользователем, имеет право вставлять в него вредоносный код. От простейшего инструмента xterm до расширенные приложения веб-браузера, такое вредоносное ПО может получить контроль над всеми другими запущенными вами приложениями — благодаря системному вызову ptrace — и незаметно для вас скопировать важную информацию.

В ответ на эту ситуацию, о которой многие пользователи не знают, был разработан механизм защиты с модулем безопасности под названием Яма в ядре Linux.

Вы можете управлять ответом на системный вызов ptrace через /proc/sys/kernel/yama/ptrace_scope файл. По умолчанию в этот файл записывается значение 0.

Допустимы следующие значения:

Ценность Значение
0 Обычное поведение: Все приложения, имеющие право на проследить можно проверить.
1 Ограниченный доступ: Только непосредственный родитель приложения или приложения отладки, разрешенные приложением с PR_SET_PTRACER опция имеет контроль. Таким образом, использование gdb имя_программы и strace имя_программы будет продолжать работать, но после этого вы не сможете подключить работающее приложение.
2 Путь к системному администратору: Только приложения с определенным CAP_SYS_PTRACE свойство или дочерние процессы, которые определяют PTRACE_TRACEME вариант с прктл можно контролировать.
3 Полностью отключен: Нет проследить допускается ни при каких обстоятельствах. Если это свойство определено один раз, вы не сможете изменить его снова во время выполнения.

Многие разработчики не знают, что приложения могут сами отключать ptrace через prctl, кроме пользователя root. Хотя программное обеспечение, связанное с безопасностью, такое как агент OpenSSH, выполняет эти операции, было бы неправильно ожидать такого же поведения от всего программного обеспечения, работающего в системе.

Недавно, некоторые дистрибутивы Linux начали устанавливать значение по умолчанию для ptrace_scope файл, описанный выше, в 1. Таким образом, с ограничением операций ptrace во всей системе обеспечивается более безопасная рабочая среда.

Использование примера трассировки

Зарегистрируйте пример приложения ниже с именем ministrace.c. Затем вы можете скомпилировать его с помощью следующей команды:

gccминистрминистр

Код:

#включать <sys/ptrace.h>
#включать <sys/reg.h>
#включать <sys/wait.h>
#включать <sys/types.h>
#включать <unistd.h>
#включать <stdlib.h>
#включать <stdio.h>
#включать <errno.h>
#включать <строка.h>
интожидание_для_системного вызова(дочерний pid_t)
{
инт статус;
пока (1) {
ptrace(PTRACE_SYSCALL, дочерний, 0, 0);
ожидание (ребенок, &статус, 0);
если (ОСТАНОВЛЕН(статус) && WSTOPSIG(статус) & 0x80)
возврат0;
если (WIFEXITED(статус))
возврат1;
}
}

интdo_child(инт аргк, уголь **аргв)
{
уголь *аргументы [argc+1];
memcpy (args, argv, argc * sizeof(уголь*));
аргументы [аргумент] = НУЛЕВОЙ;
ptrace (PTRACE_TRACEME);
убийство(получитьpid(), SIGSTOP);
возврат execvp (аргументы[0], аргументы);
}

интdo_trace(дочерний pid_t)
{
инт статус, системный вызов, retval;
ожидание (ребенок, &статус, 0);
ptrace (PTRACE_SETOPTIONS, дочерний, 0, PTRACE_O_TRACESYSGOOD);
пока(1) {
если (wait_for_syscall (дочерний) != 0) перемена;

системный вызов = ptrace (PTRACE_PEEKUSER, дочерний элемент, sizeof(длинный)*ORIG_RAX);
fprintf (stderr, "системный вызов (%d) = ", системный вызов);

если (wait_for_syscall (дочерний) != 0) перемена;

retval = ptrace (PTRACE_PEEKUSER, дочерний, sizeof(длинный)*РАКС);
fprintf (stderr, "%d
", ретваль);
}
возврат0;
}
интглавный(инт аргк, уголь **аргв)
{
если (argc < 2) {
fprintf (stderr, "Использование: %s программные аргументы
", аргумент[0]);
выход(1);
}
pid_t дочерний = fork();
если (ребенок == 0) {
возврат do_child (argc-1, аргумент+1);
} еще {
возврат do_trace (дочерний);
}
}

После компиляции приложения вы можете запустить любую команду с помощью министр и проверьте вывод:

Вы можете использовать strace для многих целей

strace может помочь найти ошибки в программах, которые без необходимости используют системные ресурсы. Точно так же с помощью strace можно выявить характеристики, проявляемые программой при использовании ресурсов операционной системы.

Поскольку strace напрямую прослушивает системные вызовы, он может выявить динамику выполнения независимо от того, открыт или закрыт код выполняемой программы. Можно получить представление о том, почему программы выдают ошибку при запуске с использованием strace.

Точно так же strace помогает понять, почему программа неожиданно завершает работу. Поэтому знание strace очень важно при разработке ядра Linux и системном администрировании.

Создайте свою собственную операционную систему с помощью Linux с нуля [Linux]

Читать далее

ДелитьсяТвитнутьДелитьсяЭл. адрес

Похожие темы

  • линукс
  • Команды Linux
  • Ядро Linux

Об авторе

Фатих Кючюккаракурт (опубликовано 6 статей)

Инженер и разработчик программного обеспечения, фанат математики и технологий. Ему всегда нравились компьютеры, математика и физика. Он разработал проекты игровых движков, а также машинное обучение, искусственные нейронные сети и библиотеки линейной алгебры. Кроме того, продолжает работать над машинным обучением и линейными матрицами.

Другие работы Фатиха Кючюккаракурта

Подпишитесь на нашу рассылку

Подпишитесь на нашу рассылку технических советов, обзоров, бесплатных электронных книг и эксклюзивных предложений!

Нажмите здесь, чтобы подписаться