Strace linux как пользоваться

Обновлено: 05.07.2024

В моих руководствах по LKCD и Kdump я описывал большое количество примеров того, как работать с дампом краха ядра, как отлаживать приложения, и о многом другом. Сегодняшняя статья посвящена самой важной отладочной утилите второго уровня - strace.

Введение

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

Strace с точки зрения системного администратора

Использование strace требует некоторого хакерского инстинкта. Это не для всех. Большинству простых пользователей, вероятно, никогда не понадобится strace, хотя они и могут. С другой стороны, системных администраторов, особенно занимающихся технической поддержкой, вряд ли придется уговаривать воспользоваться strace.
Однако, если вы любопытны, или хотите лучше понять, как работает система, или копание в системе является частью вашей работы, strace может стать хорошей отправной точкой. В любом случае время не будет потрачено зря.
Теперь о том, когда и как нужно использовать strace, и самое важное - на какую информацию нужно обращать особенное внимание. Сначала это покажется похожим на черную магию, но вникнув в детали и проявив некоторую дисциплинированность, вы сможете успешно управлять strace и успешно ее применять.
Strace не является единственной утилитой, способной трассировать системные вызовы. Есть еще ltrace, которая умеет работать не только с системными, но и с библиотечными вызовами, а также популярный Gnu Debugger (gdb), который представляет собой полнофункциональный отладчик программного кода.
Далее мы поговорим об этом в деталях. Важно помнить, что хотя strace не столь мощная утилита, как две вышеуказанные, она намного безопаснее и проще в использовании. ltrace имеет склонность обрушивать процессы, которые она отслеживает. gdb намного более сложен и требует глубокого знания кода. Лучше всего с ним работать, если доступны исходные коды, что бывает не всегда. strace можно назвать легкой артиллерией, но он удобен и всегда под рукой.

Что нужно знать перед тем, как начать работу со strace

strace не является чудодейственным средством. Она всего лишь предоставляет некоторую, весьма ограниченную, информацию о запущенном процессе. Чтобы получить полную картину, понадобится намного больше действий, включая использование ltrace и отладку, а также компилирование вашего приложения (или ядра) с отладочной информацией, профилирование запуска приложения с помощью соотвествующей утилиты, и кое-что еще.
strace - это только начало. Но очень хорошее начало. Она направит вас в нужном направлении, либо обеспечит решение проблемы.
strace нужно использовать в том случае, когда вы встречаетесь с проблемой, которую можно воспроизвести, и при этом вы не видите очевидных причин ее возникновения. Ниже мы рассмотрим примеры такого рода.
strace цепляет процесс и обычно заставляет его выполнять каждую операцию дважды - один раз для трассировки, и один раз для его собственного назначения. Это приводит к дополнительным затратам времени. Более того, это означает, что могут появиться некоторые более деликатные проблемы, зависящие от точного времени выполнения, например различные баги, связанные со скоростью работы, могут не проявиться при трассировке.
strace может привести к краху приложения.
64-битная версия strace может не заработать нормально с 32-битными программами.
Не все программы могут трассироваться. Причиной этого могут быть как специфические ошибки в коде программы, так и целенаправленная защита от трассировки. Последнее особенно часто встречается при работе с проприетарными программами.
Теперь, если вы готовы, начнем.

Примеры!

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

Основы использования strace

Пример использования с командой dd:

В результате получим следующий вывод:

вывод strace с командой dd

Выглядит достаточно беспорядочно и трудно для понимания.

Дополнительные флаги

Вы можете вызвать strace с дополнительными флагами:

Мы использовали следующие флаги:
-o указывает, в какой файл перенаправляется вывод, чтобы его можно было спокойно почитать позже.
-s 512 увеличивает длину строки до 512 байт. По умолчанию она равна 32 байта.

Теперь результат выглядит лучше:

И содержимое файла:

Полный вывод

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

Например, у нас есть 1500 вызовов записи, включая 8 ошибок. 67% времени процесса затрачено на запись, вероятно вследствие работы команды dd. Но у нас есть также достаточно много вызовов чтения.
Другие полезные флаги - это -f (ответвление), -Tt (время, затраченное на системный вызов, или между вызовами) и другие. Для трассировки уже запущенного процесса необходимо использовать флаг -p, за которым идет ID процесса (PID). Его можно узнать, выведя список процессов командой ps и найдя требуемый процесс по имени.

Теперь мы знаем, как использовать strace. Давайте посмотрим, что с помощью него можно сделать.

Пример 1

Теперь, если мы переименуем исходный файл, а затем попытаемся его скопировать под старым именем, получим ошибку:

Итак, команда cp выполнена, видимых ошибок нет, отлично. Теперь проверим статус. Получаем 1, значит что-то пошло не так. Если это простая команда копирования, проверить ее выполнение достаточно просто, но что, если вы запустили сложный скрипт, который работает с десятками директорий и копирует сотни файлов?

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

У нас есть лог-файл по имени cp-fail. Мы откроем его в текстовом редакторе и посмотрим на содержимое. Самый большой вопрос - что там нужно искать? В нашем случае, мы производили копирование, для чего нужны исходный и целевой файлы. У нас могут быть проблемы с наличием исходного или целевого файлов, недостаток прав для выполнения операции, или проблема со свободным пространством на диске. Возможен любой из этих вариантов.
Поэтому мы найдем имя исходного файла в логе и посмотрим, имеются ли здесь какие-либо ошибки.

Это значит, что нас интересует только вызов stat64, и никакие другие.

В таком случае вывод будет намного короче и проще для сортироваки, так как у нас всего два файла, к которым требуется доступ.

Изучение системных вызовов

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

Давайте посмотрим второй пример.

Пример 2

В этом примере я покажу вам, как отлаживать проблемы с сетью. Вы попытаемся пропинговать маршрут в своей локальной сети. Снача мы увидим успешный пример, затем мы остановим сеть и увидим ошибку. Затем мы перенаправим все ошибки в /dev/null, чтобы мы не знали, что произошло. strace поможет нам докопаться до первопричины.

Итак, нормальный пинг:

Теперь мы отключаем сеть:

Как вы можете видеть, статус выполнения 2, что нехорошо. Но мы не знаем, в чем дело. Время запустить strace, чтобы найти причину ошибки.

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

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

Заключение

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

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

Команда strace Linux

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

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

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

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

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

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

Примеры использования Strace

1. Запуск программы

Самый простой способ запуска утилиты - просто передать ей в параметрах имя команды или исполняемый файл программы, которую мы хотим исследовать. Например, uname:

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

openat(AT_FDCWD, "/usr/local/cuda-6.5/lib64/tls/x86_64/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)

И здесь ядро вернуло положительный результат.

2. Подключение к запущенной программе

Если программа, которую нам надо отследить, уже запущена, то не обязательно её перезапускать с нашей утилитой. Можно подключиться к ней по ее идентификатору PID. Для тестирования этой возможности запустим утилиту dd, которая будет записывать нули из /dev/zero в файл file1:

dd if=/dev/zero of=

Теперь узнаем PID нашего процесса, поскольку он такой один, можно воспользоваться pidof, вы же можете использовать ps:

И осталось подключиться к нашему процессу:

sudo strace -p 31796

В выводе утилиты мы видим, что она читает данные из одного места с помощью вызова read и записывает в другое через write. Чтобы отсоединится от процесса, достаточно нажать Ctrl+C. Дальше рассмотрим примеры strace Linux для фильтрации данных.

3. Фильтрация системных вызовов

Утилита выводит слишком много данных, и, зачастую, большинство из них нас не интересуют. С помощью опции -e можно применять различные фильтры для более удобного поиска проблемы. Мы можем отобразить только вызовы stat, передав в опцию -e такой параметр trace=stat:

sudo strace -e trace=stat nautilus

Кроме непосредственно системных вызовов, в качестве параметра для trace можно передавать и такие значения:

  • file - все системные вызовы, которые касаются файлов;
  • process - управление процессами;
  • network - сетевые системные вызовы;
  • signal - системные вызовы, что касаются сигналов;
  • ipc - системные вызовы IPC;
  • desc - управление дескрипторами файлов;
  • memory - работа с памятью программы.

4. Возвращение ошибки

Можно попросить strace вернуть программе ошибку по нужному системному вызову -e, но с параметром fault. Синтаксис конструкции такой:

fault = имя_вызова : error = тип_ошибки : when = количество

С именем вызова всё понятно, тип ошибки, номер ошибки, которую надо вернуть. А с количеством всё немного сложнее. Есть три варианта:

  • цифра - вернуть ошибку только после указанного количества запросов;
  • цифра+ - вернуть ошибку после указанного количества запросов и для всех последующих;
  • цифра+шаг - вернуть ошибку для указанного количества и для последующих с указанным шагом.

Например, сообщим uname, что системного вызова uname не существует:

sudo strace -e fault=uname uname

В выводе видим, что система вернула программе нашу ошибку, а потом та с помощью вызова write говорит пользователю, что узнать версию и называние системы невозможно.

5. Фильтрация по пути

Если вас интересует не определённый вызов, а все операции с нужным файлом, то можно выполнить фильтрацию по нему с помощью опции -P. Например, меня интересует, действительно ли утилита lscpu обращается к файлу /proc/cpuinfo, чтобы узнать информацию о процессоре:

strace -P /proc/cpuinfo lscpu

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

6. Статистика системных вызовов

С помощью опции -с вы можете собрать статистику для системных вызовов, которые использует программа. Например, сделаем это для nautilus:

sudo strace -c nautilus

Во время работы утилита ничего выводить не будет. Результат будет рассчитан и выведен, когда вы завершите отладку. В выводе будут такие колонки:

  • time - процент времени от общего времени выполнения системных вызовов;
  • seconds - общее количество секунд, затраченное на выполнение системных вызовов этого типа;
  • calls - количество обращений к вызову;
  • errors - количество ошибок;
  • syscall - имя системного вызова.

Если вы хотите получать эту информацию в режиме реального времени, используйте опцию -C.

7. Отслеживание времени выполнения

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

Можно также отображать микросекунды:

strace -tt uname

Или отображать время в формате UNIX:

strace -ttt uname

Чтобы добавить время выполнения вызова, добавьте -T:

strace -ttt -T uname

Выводы

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

Нет похожих записей


Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна.

Оцените статью:

(6 оценок, среднее: 4,83 из 5)

Об авторе

4 комментария

Какие есть еще системные утилиты для диагностики неисправности, и анализа работы программ? И если можете сделайте статейки на них. Еще интересуют программы для анализа трафика - НЕ Wireshark. Есть GUI версии программ ?
Спасибо.

Самое банальное - запуск программы из консоли. Возможно, она в терминал вывалит диагностическую информацию, среди которой будут и ошибки. Это же (и еще кое-что) можно и в journalctl посмотреть.

Саму программу имеет смысл запускать в режиме дебага. Имею в виду, что бывают "специальные" ключи (наподобие -v у ssh), которые дают более подробный вывод, они в man'е, и/ или в конфиге выставить, чтобы она писала лог с максимальной подробностью, в какой-либо файл (у вебсерверов это есть). Ну и смотреть этот файл, как вариант, через tail -F в режиме реального времени.
Если же сам что-то менял и где-то неочевидно накосячил при установке/ настройке, то можно и пакет банально переставить, если сервис не успел развернуть 🙂

Иногда имеет смысл посмотреть через ldd (и выставление LD_DEBUG=all), что за библиотеки нужны софтине, и нашла ли она их.

Для анализа трафика в реальном времени - tcpdump. Неясно чем Wireshark не угодил, работает почти так же, тот же захват трафика, навешивание фильтров, только еще куча всяких фенечек и собственно GUI, который вы хотите. Если интересует статистика, то можно логировать через тот же iptables.
Если статистика, но более серьезно. то это уже скорее область сетевого железа, с их netflow и пр.

Программы Linux просят ядро ​​сделать за них кое-что. Команда strace показывает эти системные вызовы. Вы можете использовать их, чтобы понять, как работают программы и почему иногда нет.

Ядро и системные вызовы

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

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

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

Установка strace

Если strace еще не установлен на вашем компьютере, вы можете легко установить его.

В Ubuntu используйте эту команду:

sudo apt install strace


В Fedora введите эту команду:

sudo dnf установить strace


На Манджаро команда:

sudo pacman -Sy strace


Первые шаги со 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. Это завершает все потоки в приложении и отправляет возвращаемое значение обратно в оболочку.


Фильтрация вывода

Даже с нашей простой демонстрационной программой получается довольно много результатов. Мы можем использовать параметр -e (выражение). Мы передадим имя системного вызова, который хотим видеть.

strace -e написать ./stex


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

strace -e закрыть, написать ./stex


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

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

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

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



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


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

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


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


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


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


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


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


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

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

ps -e | grep firefox


sudo strace -p 8483


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


Создание отчета

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


  • % времени: процент времени выполнения, затраченный на каждый системный вызов.
  • секунды: общее время, выраженное в секундах и микросекундах, затраченное на каждый системный вызов.
  • usecs / call: среднее время в микросекундах, затраченное на каждый системный вызов.
  • calls: количество раз, когда был выполнен каждый системный вызов.
  • ошибки: количество сбоев для каждого системного вызова.
  • syscall: имя системного вызова.

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

Глубокое понимание, легко

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

Привет, %username% ! Поговорим о такой болезни как вуайеризм. Подглядывать мы будем за процессами в Linux, а использовать для столь интимного дела мы будем утилиту strace .

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

strace — это бесплатная утилита, распространяемая под BSD-лицензией. Изначально она была написана Paul Kranenburg для SunOS и называлась trace . Затем усилиями Branko Lankester она была портирована на Linux, включая поддержку специфики Linux-ядра. Затем, в 1993 году, версии strace для SunOS и Linux были объединены в одну, был добавлен некоторый функционал truss из SVR4 . В итоге получившийся винегрет назвали strace , который теперь работает на многих UNIX-платформах. Сегодня разработкой утилиты занимаются Wichert Akkerman и Roland McGrath .

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

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

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

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

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

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

В общем случае запуск strace выглядит так:

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

Ещё, как вариант, можно запускать strace для трассировки уже запущенного процесса. Для этого необходимо знать PID нужного процесса и передать его в качестве параметра опции -p утилиты:

Предлагаю попробовать запустить что-нибудь и поглазеть, как strace ведёт себя в реальной жизни. Возьмём одну из наиболее часто используемых программ и посмотрим, что же она делает “за кулисами”.

Вывод файла достаточно велик, поэтому здесь не выкладываю. Думаю, кому интересно, сами попробуют на своей системе. Рассмотрим лишь несколько строк в качестве примера.

Структура каждой строки вывода strace следующая. Первым идёт имя системного вызова. Затем в круглых скобках выводится список параметров, переданных вызову. И последним, после знака равенства, отображается код завершения системного вызова. Подробную документацию по каждому системному вызову в случае необходимости можно найти на соответствующих man-страницах второго раздела.

strace может оказаться (и оказывается!) весьма полезной утилитой как для программистов, так и для системных администраторов, помогая отыскать причины “падений” или некорректной работы программ с закрытыми или недоступными исходными кодами.

Читайте также: