Команда strace в linux

Добавление меток времени

Вы можете добавить к выводу несколько разных отметок времени. Параметр -r (относительные отметки времени) добавляет отметки времени, которые показывают разницу во времени между началом каждого последующего системного вызова

Обратите внимание, что эти значения времени будут включать время, потраченное на предыдущий системный вызов, и все остальное, что программа делала до следующего системного вызова

strace -r ./stex

Метки времени отображаются в начале каждой строки вывода.

Чтобы увидеть количество времени, затраченного на каждый системный вызов, используйте параметр -T (syscall-times). Это показывает продолжительность времени, проведенного внутри каждого системного вызова.

strace -T ./stex

Продолжительность времени отображается в конце каждой строки системного вызова.

Чтобы увидеть время, в которое был вызван каждый системный вызов, используйте параметр -tt (абсолютные отметки времени). Это показывает время «настенных часов» с разрешением в микросекунды.

strace -tt ./stex

Время отображается в начале каждой строки.

Примеры и инструменты

В UNIX-подобных и других совместимых с POSIX операционных системах популярными системными вызовами являются open, read, write, close, wait, exec, fork, exit, and kill. Многие современные операционные системы имеют сотни системных вызовов. Например, в Linux и OpenBSD каждый из них имеет более 300 различных вызовов. У NetBSD около 500, у FreeBSD более 500, Microsoft Windows 7 имеет почти 700, пока Plan 9 имеет 51.

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

Первые шаги со strace

Мы собираемся использовать небольшую программу, чтобы продемонстрировать . Он мало что делает: открывает файл и записывает в него строку текста, и в нем нет проверки на ошибки. Это просто быстрый взлом, чтобы мы могли что-то использовать .

#включают int main (int argc, char argv []) {// дескриптор файла FILE * fileGeek; // открыть файл с именем "strace_demo.txt" или создать его fileGeek = fopen ("strace_demo.txt", "w"); // записываем текст в файл fprintf (fileGeek, "Записываем это в файл"); // закрываем файл fclose (fileGeek); // выход из программы return (0); } // конец основного

Мы сохранили это в файле с именем «file-io.c» и с расширением. составлен в исполняемый файл под названием , названный в честь «NSпробег Exмножество. «

gcc -o stex файл-io.c

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

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

страйс ./стекс

Мы ясно видим это Системный вызов отправляет текст «Запишите это в файл» нашему открытому файлу и Системный вызов. Это завершает все потоки в приложении и отправляет возвращаемое значение обратно в оболочку.

Пример: многопоточные программы

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

Собирать её надо, естественно, со специальным приветом линковщику — флагом -pthread:

Флаг -f , как и в случае с обычными процессами, добавит в начало каждой строки pid процесса.

При работе в несколько потоков системных вызовов становится слишком много:

Имеет смысл ограничиться только управлением процессами и системным вызовом write :

Кстати, вопросы. Какой системный вызов используется для создания нового потока? Чем такой вызов для потоков отличается от вызова для процессов?

История

Strace изначально был написан для SunOS авторства Пола Краненбурга в 1991 г., согласно уведомлению об авторских правах и опубликованному в начале 1992 г. в третьем томе comp.sources.sun. Начальный ПРОЧТИ МЕНЯ файл содержал следующее:

Позже Бранко Ланкестер перенес эту версию на Linux, выпустив свою версию в ноябре 1992 года, а второй — в 1993 году. Ричард Сладки объединил эти отдельные версии strace в 1993 году и перенес программу на SVR4 и Солярис в 1994 г. в результате появился strace 3.0, о котором было объявлено в comp.sources.misc в середине 1994 года.

Начиная с 1996 года, strace обслуживает Вихерт Аккерман. За время его пребывания на этом посту развитие strace перешло на CVS; порты в FreeBSD были представлены многие архитектуры Linux (включая ARM, IA-64, MIPS, PA-RISC, PowerPC, s390, SPARC). В 2002 году бремя поддержки strace было передано Роланду МакГрату. С тех пор strace получил поддержку нескольких новых архитектур Linux (AMD64, s390x, SuperH), поддержку двух архитектур для некоторых из них, а также получил многочисленные дополнения и улучшения в декодерах системных вызовов в Linux; разработка strace перешла на мерзавец в тот период. С 2009 года strace активно поддерживает Дмитрий Левин. С тех пор strace получил поддержку архитектур AArch64, ARC, AVR32, Blackfin, Meta, Nios II, OpenSISC 1000, RISC-V, Tile / TileGx, Xtensa.

Последняя версия strace, в которой были (очевидно, мертвые) код для не-Linux Операционная система была 4.6, выпущена в марте 2011 года. В версии strace 4.7, выпущенной в мае 2012 года, весь код, отличный от Linux, был удален; начиная со strace 4.13, проект следует графику выпуска ядра Linux, а с версией 5.0 он также следует схеме управления версиями Linux.

В 2012 году strace также получил поддержку трассировки путей и декодирования путей к файловым дескрипторам. В августе 2014 года была выпущена strace 4.9., где была добавлена ​​поддержка печати трассировки стека. В декабре 2016 г., системный вызов введение неисправности функция была реализована.

История версий

Версия Дата выхода
5.9 24 сентября 2020 г.
5.8 6 августа 2020
5.7 1 июня 2020 г.
5.6 7 апреля 2020 г.
5.5 6 февраля 2020 г.
5.4 28 ноября 2019 г.
5.3 25 сентября 2019 г.
5.2 12 июля 2019 г.
5.1 22 мая 2019
5.0 19 марта 2019 г.
4.26 26 декабря 2018 г.
4.25 30 октября 2018 г.
4.24 14 августа 2018 г.
4.23 14 июня 2018 г.
4.22 5 апреля 2018 г.
4.21 13 февраля 2018 г.
4.20 13 ноября 2017 г.
4.19 5 сентября 2017 г.
4.18 5 июля 2017 г.
4.17 24 мая 2017
4.16 14 февраля 2017 г.
4.15 14 декабря 2016 г.
4.14 4 октября 2016 г.
4.13 26 июля 2016 г.
4.12 31 мая 2016
4.11 21 декабря 2015 г.
4.10 6 марта 2015 г.
4.9 15 августа 2014 г.
4.8 3 июня 2013 г.
4.7 2 мая 2012
4.6 15 марта 2011 г.
4.5.20 13 апреля 2010 г.
4.5.19 21 октября 2009 г.
4.5.18 28 августа 2008 г.
4.5.17 21 июля 2008 г.
4.5.16 3 августа 2007 г.
4.5.15 16 января 2007 г.
4.5.14 16 января 2007 г.
4.5.13 3 августа 2005 г.
4.5.12 8 июня 2005 г.
4.5.11 22 марта 2005 г.
4.5.10 13 марта 2005 г.
4.5.9 4 февраля 2004 г.
4.5.8 19 октября 2004 г.
4.5.7 31 августа 2004 г.
4.5.6 12 июля 2004 г.
4.5.5 27 июня 2004 г.
4.5.4 3 июня 2004 г.
4.5.3 16 апреля 2004 г.
4.5.2 1 марта 2004 г.
4.5.1 13 ноября 2003 г.
4.5 24 сентября 2003 г.
4.4 19 августа 2001 г.
4.3.1 7 апреля 2001 г.
4.3 1 апреля 2001 г.
4.2 21 января 2000 г.
4.1 26 ноября 1999 г.
4.0.1 25 июля 1999 г.
4.0 9 июля 1999 г.
3.99.1 9 июня 1999 г.
3.99 27 апреля 1999 г.
3.1 1 июня 1996 г.
3.0 9 июля 1994 г.

Пример: fwrite

Вот шаги, которые включает в себя вызов C-функции fwrite:

  1. fwrite вместе с остальной частью стандартной библиотеки C реализован в glibc.
  2. fwrite вызывает более низкоуровневую функцию write.
  3. write загружает идентификатор системного вызова (который равен 1 для write) и аргументы в регистры процессора, а затем заставит процессор переключиться на уровень ядра. То, как это делается, зависит от архитектуры процессора, а иногда и от модели процессора. Например, процессоры x86 обычно вызывают прерывание 80, а процессоры x86-64 используют инструкцию процессора syscall.
  4. Процессор, который теперь работает в режиме ядра, передает идентификатор системного вызова в таблицу системных вызовов, извлекает указатель функции со смещением 1 и вызывает функцию. Эта функция, sys_write, является реализацией записи в файл.

Команда strace Linux

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

$ strace опции команда аргументы

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

  • -i — выводить указатель на инструкцию во время выполнения системного вызова;
  • -k — выводить стек вызовов для отслеживаемого процесса после каждого системного вызова;
  • -o — выводить всю информацию о системных вызовах не в стандартный поток ошибок, а в файл;
  • -q — не выводить сообщения о подключении о отключении от процесса;
  • -qq — не выводить сообщения о завершении работы процесса;
  • -r — выводить временную метку для каждого системного вызова;
  • -s — указать максимальный размер выводимой строки, по умолчанию 32;
  • -t — выводить время суток для каждого вызова;
  • -tt — добавить микросекунды;
  • -ttt — добавить микросекунды и количество секунд после начала эпохи Unix;
  • -T — выводить длительность выполнения системного вызова;
  • -x — выводить все не ASCI-строки в шестнадцатеричном виде;
  • -xx — выводить все строки в шестнадцатеричном виде;
  • -y — выводить пути для файловых дескрипторов;
  • -yy — выводить информацию о протоколе для файловых дескрипторов;
  • -c — подсчитывать количество ошибок, вызовов и время выполнения для каждого системного вызова;
  • -O — добавить определённое количество микросекунд к счетчику времени для каждого вызова;
  • -S — сортировать информацию выводимую при опции -c. Доступны поля time, calls, name и nothing. По умолчанию используется time;
  • -w — суммировать время между началом и завершением системного вызова;
  • -e — позволяет отфильтровать только нужные системные вызовы или события;
  • -P — отслеживать только системные вызовы, которые касаются указанного пути;
  • -v — позволяет выводить дополнительную информацию, такую как версии окружения, статистику и так далее;
  • -b — если указанный системный вызов обнаружен, трассировка прекращается;
  • -f — отслеживать также дочерние процессы, если они будут созданы;
  • -ff — если задана опция -o, то для каждого дочернего процесса будет создан отдельный файл с именем имя_файла.pid.
  • -I — позволяет блокировать реакцию на нажатия Ctrl+C и Ctrl+Z;
  • -E — добавляет переменную окружения для запускаемой программы;
  • -p — указывает pid процесса, к которому следует подключиться;
  • -u — запустить программу, от имени указанного пользователя.

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

  • fork — создание нового дочернего процесса;
  • read — попытка читать из файлового дескриптора;
  • write — попытка записи в файловый дескриптор;
  • open — открыть файл для чтения или записи;
  • close — закрыть файл после чтения или записи;
  • chdir — изменить текущую директорию;
  • execve — выполнить исполняемый файл;
  • stat — получить информацию о файле;
  • mknod — создать специальный файл, например, файл устройства или сокет;

А теперь разберём примеры strace Linux.

Как работают переменные среды

Когда вы запускаете окно терминала и оболочка внутриссылка на коллекцию переменных обеспечивает правильную настройку оболочки. Эти переменные также обеспечивают доступность любой информации, к которой может понадобиться окно терминала и оболочка. В совокупности эти переменные содержат настройки, которые определяют среду, которую вы находите в окне терминала, вплоть до вида командной строки. Поэтому, естественно, они упоминаются как переменные среды.

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

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

Использование и особенности

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

Альтернативное приложение — использовать флаг для прикрепления к запущенному процессу. Это полезно, если процесс перестал отвечать, и может показать, например, что процесс блокируется при попытке установить сетевое соединение.

Среди других функций strace позволяет:

  • Указание фильтра имен системных вызовов, которые следует отслеживать (через вариант): по имени, например клон, вилка, vfork; используя одну из предопределенных групп, например % ipc или же %файл; или (начиная со strace 4.17) с использованием синтаксиса регулярных выражений, например .
  • Указание списка трассируемых путей (, Например).
  • Указание списка файловых дескрипторов, ввод / вывод которых должен быть сброшен ( и опции).
  • Подсчет времени выполнения системного вызова и подсчет (, , , и опции).
  • Печать отметок относительного или абсолютного времени ( и опции).
  • Изменение кода возврата и ошибки указанных системных вызовов и внедрение сигналов при их выполнении (начиная с strace 4.15, вариант).
  • Извлечение информации о файловых дескрипторах (включая сокеты, вариант).
  • Печать трассировок стека, включая (начиная со strace 4.21) расшифровку символов ( вариант).
  • Фильтрация по статусу возврата системного вызова ( вариант; начиная со strace 5.2).

strace поддерживает декодирование аргументов некоторых классов ioctl команды, такие как BTRFS_ *, V4L2_ *, DM_ *, NSFS_ *, MEM *, EVIO *, KVM_ *, и несколько других.

Поскольку strace детализирует только системные вызовы, его нельзя использовать для обнаружения такого количества проблем, как отладчик кода, такой как Отладчик GNU (ГДБ). Однако его проще использовать, чем отладчик кода, и он является очень полезным инструментом для системных администраторов. Он также используется исследователями для генерации трассировки системных вызовов на будущее. повтор системного вызова.

Первые шаги со strace

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

Мы сохранили это в файле под названием «file-io.c» и скомпилировали его с помощью gcc в исполняемый файл под названием stex, названный в честь «strace example».

gcc -o stex файл-io.c

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

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

Мы ясно видим, как системный вызов write отправляет текст «Write this to the file» в наш открытый файл и системный вызов exit_group. Это завершает все потоки в приложении и отправляет возвращаемое значение обратно в оболочку.

Не слышали о торговых роботах форекс раньше?

Легкие деньги без каких-либо усилий — вот что такое советник FX Shutter Stock EA. Это автоматизированная стратегия Forex и запрограммированная аналитическая система, которая позволяет вам расслабиться, расслабиться и просто наблюдать за тем, как FX Trading Robot делает деньги. После того, как установили и выставили параметры, робот берет всю работу на себя и торгует для вас. Это позволяет вам фокусировать свою энергию на других важных вопросах.EA FX Shutter Stock EA работает 24/5, ища выгодные возможности входа в рынок в ночные сессии и прорывы, когда можно ожидать выигрыша. Поэтому, если вы не отключите его, вы не пропустите ни одного выгодной сделки.В отличие от нас, трейдеров, советник FX Shutter не имеет эмоциональной нестабильности и будет работать только в полностью вычислительной среде. Консультант-эксперт не будет принимать решения в срочном порядке; На самом деле он собирается собирать факты и цифры, не испытывая страх, опасения и стресс.

Глубокое понимание, очень просто

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

С помощью , вы можете увидеть полную картину.

Команды Linux
Файлы деготь · pv · кошка · TAC · CHMOD · GREP · разница · СЕПГ · Работы С Нами · человек · толкнул · Popd · Fsck · Тестовый диск · далее · fd · пандок · CD · $ ПУТЬ · AWK · присоединиться · jq · морщины · уникальный · журналctl · хвост · состояние · ls · Fstab · эхо · меньше · команда chgrp · Чаун · оборот · смотреть · Струны · Тип · переименовать · Почтовый код · расстегнуть молнию · собираться · Ummount · Для установки · FDISK · МКФС · rm · RmDir · Rsync · df · GPG · погода · Нано-бамбуковое волокно · MkDir · из · ln · Патчи · Конвертировать · рклон · Обрывки · SRM
Процессы псевдоним · экран · выше · вид · Ренис · прогресс · Трассирование · система · tmux · чш · История · at · Партия · бесплатно · который · dmesg · чфн · Пользовательский мод · ps · корневой · xargs · терминал · мизинец · Lsof · vmstat · Время ожидания · стена · да сэр · убивать · спать · Sudo · это · Время · группадобавить · Пользовательский мод · группы · lshw · выключить · начать все заново · Stop · выключить · ПАРОЛЬ · lscpu · кронтаб · данные · bg · fg
сетей NetStat · кольцо · Трассировка маршрута · ip · ss · кто · fail2ban · бмон · она · палец · птар · FTP · виться · Wget · кто · кто я · w · Iptables · SSH-серийник · UFW

Лучшие ноутбуки с Linux для разработчиков и энтузиастов

Режим процессора и переключение контекста [ править ]

Системные вызовы в большинстве Unix-подобных систем обрабатываются в режиме ядра , что достигается изменением режима выполнения процессора на более привилегированный, но переключение контекста процесса не требуется — хотя переключение контекста привилегий действительно происходит. Аппаратное обеспечение видит мир с точки зрения режима выполнения в соответствии с регистром состояния процессора , а процессы — это абстракция, предоставляемая операционной системой. Системный вызов обычно не требует переключения контекста на другой процесс; вместо этого он обрабатывается в контексте того, какой процесс его вызвал.

  • Модель « многие к одному» : все системные вызовы из любого пользовательского потока в процессе обрабатываются одним потоком уровня ядра. У этой модели есть серьезный недостаток — любой системный вызов блокировки (например, ожидание ввода от пользователя) может заморозить все другие потоки. Кроме того, поскольку только один поток может получить доступ к ядру одновременно, эта модель не может использовать несколько ядер процессора.
  • Модель « один к одному» : каждый пользовательский поток присоединяется к отдельному потоку уровня ядра во время системного вызова. Эта модель решает указанную выше проблему блокировки системных вызовов. Он присутствует во всех основных дистрибутивах Linux , macOS , iOS , последних версиях Windows и Solaris .
  • Модель « многие ко многим» : в этой модели пул пользовательских потоков сопоставляется с пулом потоков ядра. Все системные вызовы из пула пользовательских потоков обрабатываются потоками в соответствующем пуле потоков ядра .
  • Гибридная модель: эта модель реализует как модель «многие ко многим», так и модель «один к одному» в зависимости от выбора, сделанного ядром. Это можно найти в старых версиях IRIX , HP-UX и Solaris .

Отслеживание запущенного процесса

Если процесс, который вы хотите отследить, уже запущен, вы все равно можете прикрепить к нему strace. Для этого вам нужно знать идентификатор процесса. Вы можете использовать ps с grep, чтобы найти это. У нас работает Firefox. Чтобы узнать идентификатор процесса firefox, мы можем использовать ps и передать его через grep.

ps -e | grep firefox

Мы видим, что идентификатор процесса — 8483. Мы будем использовать параметр -p (идентификатор процесса), чтобы указать strace, к какому процессу подключиться

Обратите внимание, что вам нужно будет использовать sudo:

sudo strace -p 8483

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

Промежуточная библиотека

Обычно, системы предоставляют библиотеку или API , которые находятся среди обычных программ и операционной системой. В Unix-подобных системах этот API обычно является частью реализации библиотеки С (libc), такой как glibc, которая обеспечивает функции –оболочки для системных вызовов, которые, в свою очередь, часто называются также, как и системные вызовы, которые они вызывают. В Windows NT этот API является частью Native API, в библиотеке ntdll.dll; Это недокументированный API, используемый реализациями обычного Windows API и непосредственно используется некоторыми системными программами в Windows. Функции-оболочки библиотеки предоставляют обычное соглашение о вызове функций (вызов подпрограммы на уровне сборки) для использования системного вызова, а также делают системный вызов более модульным. Здесь основной функцией-оболочки является помещение всех аргументов, которые должны быть переданы системному вызову в соответствующие регистры процессора (возможно, и в стек вызовов), а также установка уникального номера системного вызова для вызова ядра. Таким образом, библиотека, которая существует между ОС и приложением, увеличивает мобильность.

Вызов самой функции библиотеки не приводит к переключению в режим ядра (если исполнение уже не было в режиме ядра) и обычно является обычным вызовом подпрограммы. Фактический системный вызов передает управление ядру (и более зависит от конкретной реализации и платформы, чем библиотека вызова). Например, в Unix-подобных системах функции fork и execve являются функциями библиотеки С, которые, в свою очередь, выполняют инструкции, вызывающие системные вызовы fork и exec. Создание системного вызова непосредственно в коде приложения сложнее и, к тому же, может потребовать использования встроенного ассемблерного кода (на С и С++), а также знание низкоуровневого двоичного интерфейса для операции системного вызова, который может меняться с течением времени и, следовательно, не быть частью бинарного интерфейса приложения. В системах, основанных на exokernels, библиотека особенно важна как посредник. На exokernels библиотеки защищают пользовательские приложения от API ядра с очень низким уровнем и обеспечивают управление ресурсами.

Операционные системы IBM, происходящие от OS / 360 и DOS / 360, включая z / OS и z / VSE, реализуют системные вызовы через библиотеку макросов языка ассемблера. Это связано с их происхождение, поскольку в то время программирование на языке ассемблера было более распространено, чем использование языков высокого уровня. Таким образом, системные вызовы IBM не могут напрямую исполняться языковыми программами высокого уровня, но требуют подпрограмму вызываемую ассемблером.

Примеры

Ниже приведен пример типичного вывода команды:

user@server:~$ strace ls
...
open(".", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_CLOEXEC) = 3
fstat64(3, {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
fcntl64(3, F_GETFD)                     = 0x1 (flags FD_CLOEXEC)
getdents64(3, /* 18 entries */, 4096)   = 496
getdents64(3, /* 0 entries */, 4096)    = 0
close(3)                                = 0
fstat64(1, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f2c000
write(1, "autofs\nbackups\ncache\nflexlm\ngames"..., 86autofsA

Приведенный выше фрагмент — это лишь небольшая часть вывода strace при запуске по команде ‘ ls ‘. Он показывает, что текущий рабочий каталог открыт, проверяется и извлекается его содержимое. Полученный список имен файлов выводится на стандартный вывод.

Послесловие

Утилита strace — простой и надёжный инструмент. Но помимо системных вызовов отлаживать случается и другие аспекты работы программ и операционной системы. Например, отслеживать вызовы динамически линкуемых библиотек умеет ltrace, заглянуть в работу операционной системы могут SystemTap и ftrace, а глубоко исследовать производительность программ позволяет perf. Тем не менее именно strace — первая линия обороны в случае проблем с собственными и чужими программами, и использую я её минимум пару раз в неделю.

Словом, любите Unix, читайте man 1 strace и не стесняйтесь подглядывать за вашими программами!

Источник

Примеры и инструменты [ править ]

На Unix , Unix-подобных и других POSIX — совместимые операционные системы, популярные системные вызовы , , , , , , , , и . Многие современные операционные системы имеют сотни системных вызовов. Например, Linux и OpenBSD имеют более 300 различных вызовов, NetBSD — около 500, FreeBSD — более 500, Windows 7 — около 700, в то время как Plan 9 имеет 51.

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

Как установить советник?

Здесь действует стандартная схема: 

  • устанавливаем торговую платформу MetaTrader 4, так как робот совместим только с ней;
  • переходим к скачиванию программы FX Shutter Stock EA. Советуем все-таки использовать платную лицензированную версию, которая более усовершенствована. Робот представлен в виде стандартного zip-документа, в котором находится файл формата .ex4;
  • всю информацию из папки Experts необходимо скопировать в папку с идентичным названием, которая находится в каталоге данных;
  • во вкладке “Сервис” устанавливаем галочки напротив надписей “Позволить автоматическую торговлю” и “Разрешить импорт DLL”. После этого нужно нажать “Ок”;
  • Затем перезагрузите терминал. Если вы правильно выполнили все условия, робот FX Shutter Stock EA появится в списке советников;
  • Во всплывающем окне вы сможете изменить параметры программы. 

Происхождение видов

Главный интерфейс между программами и ядром OC в Unix — системные вызовы (англ. system calls, syscalls), взаимодействие программ с внешним миром происходит исключительно через них.

Но в первой публичной версии Unix (Version 6 Unix, 1975 год) удобных способов отслеживания поведения пользовательских процессов не было. Для решения этой проблемы Bell Labs к следующей версии (Version 7 Unix, 1979 год) предложили новый системный вызов — ptrace .

Разрабатывался ptrace прежде всего для интерактивных отладчиков, но к концу 80-х (в эпоху коммерческого уже System V Release 4) на этой основе появились и получили широчайшее распространение узконаправленные отладчики — трассировщики системных вызовов.

Первая же версия strace была опубликована Полом Кроненбургом в рассылке comp.sources.sun в 1992 году в качестве альтернативы закрытой утилите trace от Sun. Как клон, так и оригинал предназначались для SunOS, но к 1994 году strace была портирована на System V, Solaris и набирающий популярность Linux.

Сегодня strace поддерживает только Linux и опирается на всё тот же ptrace , обросший множеством расширений.

Современный (и весьма активный) мейнтейнер strace — Дмитрий Левин. Благодаря ему утилита обзавелась продвинутыми возможностями вроде инъекции ошибок в системные вызовы, поддержкой широкого спектра архитектур и, главное, маскотом. Неофициальные источники утверждают, что выбор пал на страуса из-за созвучности русского слова «страус» и английского «strace».

Немаловажно и то, что системный вызов ptrace и трассировщики так и не были включены в POSIX, несмотря на долгую историю и наличие реализации в Linux, FreeBSD, OpenBSD и традиционных Unix

strace

linux syscall tracer

  • Official repositories are at GitHub and GitLab.
  • You can get latest binary packages from Fedora rawhide, OBS, Sisyphus.
  • The latest officially signed release tarball can be found here.
  • Development takes place on the mailing list (archive). Everyone is welcome to send bug reports, feature requests, comments and patches there.
  • IRC channel: #strace@oftc.
  • strace is released under the GNU Lesser General Public License license version 2.1 or later. strace mascot is CC BY-SA 4.0, by Vitaly Chaykovsky.

strace is a diagnostic, debugging and instructional userspace utility for Linux. It is used to monitor and tamper with interactions between processes and the Linux kernel, which include system calls, signal deliveries, and changes of process state.

System administrators, diagnosticians and trouble-shooters will find it invaluable for solving problems with programs for which the source is not readily available since they do not need to be recompiled in order to trace them.

The operation of strace is made possible by the kernel feature known as ptrace.

Режим процессора и переключение контекста

Системные вызовы в большинстве Unix-подобных систем обрабатываются в режиме ядра, что достигается путем изменения режима выполнения процессора на более привилегированный, но не требуется переключения контекста процесса, хотя переключение контекста имеет место . Аппаратные средства рассматривают мир с точки зрения режима выполнения в соответствии с регистром статуса процессора, а процессы являются абстракциями, предоставляемыми операционной системой. Системный вызов обычно не требует переключения контекста на другой процесс; Вместо этого он обрабатывается в контексте того процесса, который его вызывал.

  • Модель «многие-к-одному»: все системные вызовы из любого пользовательского потока в процессе обрабатываются одним потоком уровня ядра. Эта модель имеет серьезный недостаток — любой системный вызов блокировки (например, ожидание ввода от пользователя) может заморозить все остальные потоки. Кроме того, поскольку только один поток может одновременно обращаться к ядру, эта модель не может использовать несколько ядер процессора.
  • Модель один-к-одному: каждый поток пользователя во время системного вызова присоединяется к своему собственному потоку. Эта модель решает проблему блокирования системных вызовов. она применяется в большинстве дистрибутивов Linux, Windows,Solaris последних версий.
  • Модель многие-к-многим: в этой модели во время системного вызова множество пользовательских потоков увязываются с множеством потоков уровня ядра.
  • Гибридная модель: в этой модели реализованы модели «многие-к-многим» и «один-к-одному» в зависимости от выбора ядра ОС.

Примеры

Ниже приведен пример типичного вывода команда:

пользователь @ сервер: ~ $ strace ls...open (".", O_RDONLY | O_NONBLOCK | O_LARGEFILE | O_DIRECTORY | O_CLOEXEC) = 3fstat64 (3, {st_mode = S_IFDIR | 0755, st_size = 4096, ...}) = 0fcntl64 (3, F_GETFD) = 0x1 (флаги FD_CLOEXEC)getdent64 (3, / * 18 записей * /, 4096) = 496getdent64 (3, / * 0 записей * /, 4096) = 0закрыть (3) = 0fstat64 (1, {st_mode = S_IFIFO | 0600, st_size = 0, ...}) = 0mmap2 (NULL, 4096, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0) = 0xb7f2c000write (1, "autofsbackupscacheflexlmgames" ..., 86autofsA

Приведенный выше фрагмент — лишь небольшая часть вывода strace при запуске на ‘lsкоманда. Он показывает, что текущий рабочий каталог открыт, проверяется и извлекается его содержимое. Полученный список имен файлов выводится на стандартный вывод.

Пример: отслеживание дочерних процессов

Работа с процессами через вызов fork — основа всех Unix. Давайте посмотрим, как strace работает с деревом процессов на примере несложной «плодящейся» программы:

Здесь исходный процесс создаёт дочерний процесс, оба пишут в стандартный поток вывода:

По умолчанию мы увидим только системные вызовы родительского процесса:

Отслеживать дерево процессов целиком помогает флаг -f , с которым strace отслеживает системные вызовы в процессах-потомках. К каждой строке вывода при этом добавляется pid процесса, делающего системный вывод:

В этом контексте может пригодиться фильтрация по группам системных вызовов:

Кстати, какой системный вызов используется для создания нового процесса?

Отправка вывода в файл

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

Иногда удобнее фиксировать все, искать и прокручивать весь набор результатов

Так вы случайно не исключите ничего важного. Параметр -o (вывод) позволяет отправлять вывод из сеанса strace в текстовый файл

strace -o трассировка-output.txt ./stex

Затем вы можете использовать команду less для прокрутки списка и поиска системных вызовов — или чего-либо еще — по имени.

меньше trace-output.txt

Теперь вы можете использовать все возможности поиска less для исследования результатов.

Вывод

BusyBox — это облегченная реализация пользовательских утилит UNIX, которая поставляется в виде единого двоичного файла. Вы можете комбинировать его с ядром Linux, чтобы создать работающую систему без каких-либо других зависимостей.

BusyBox оптимизирован для сред с ограниченным пространством. Это делает его идеальным для встраиваемых продуктов, таких как устройства Интернета вещей. Вы также можете найти BusyBox установленным в минимальных, но в остальном дистрибутивах Linux общего назначения, таких как Alpine Linux.

Независимо от того, используете ли вы BusyBox или GNU Coreutils, знакомые вам команды обычно «просто работают» с любой реализацией. Любые возникающие проблемы обычно возникают из-за того, что BusyBox не реализует определенный редкий флаг или параметр конфигурации.

Рейтинг
( Пока оценок нет )
Editor
Editor/ автор статьи

Давно интересуюсь темой. Мне нравится писать о том, в чём разбираюсь.

Понравилась статья? Поделиться с друзьями:
3D-тест
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: