Диагностическая, отладочная и обучающая утилита пользовательского пространства для Linux
strace — это диагностическая, отладочная и обучающая утилита пользовательского пространства для Linux . Она используется для мониторинга и вмешательства во взаимодействия между процессами и ядром Linux , включая системные вызовы , доставку сигналов и изменение состояния процесса. Работа strace возможна благодаря функции ядра, известной как ptrace .
Некоторые Unix-подобные системы предоставляют другие диагностические инструменты, похожие на strace, например truss .
История
Strace был первоначально написан для SunOS Полом Краненбургом в 1991 году, согласно его уведомлению об авторских правах, и опубликован в начале 1992 года в третьем томе comp.sources.sun. Первоначальный файл README содержал следующее: [5]
strace(1) — это трассировщик системных вызовов для систем Sun(tm), очень похожий на поставляемую Sun программу trace(1) . strace(1) — это полезная утилита для сортировки отладочных программ, для которых нет исходного кода, которая, к сожалению, включает в себя почти все поставляемое Sun системное программное обеспечение.
Позже Бранко Ланкестер перенес эту версию на Linux , выпустив свою версию в ноябре 1992 года, а второй релиз последовал в 1993 году. [6] [7] Ричард Слэдки объединил эти отдельные версии strace в 1993 году и перенес программу на SVR4 и Solaris в 1994 году, [8] что привело к появлению strace 3.0, анонсированной в comp.sources.misc в середине 1994 года. [9]
Начиная с 1996 года, strace поддерживал Wichert Akkerman. Во время его пребывания в должности разработка strace перешла на CVS ; были представлены порты на FreeBSD и многие архитектуры на Linux (включая ARM, IA-64, MIPS, PA-RISC, PowerPC, s390, SPARC). В 2002 году бремя поддержки strace было передано Roland McGrath. С тех пор strace получил поддержку нескольких новых архитектур Linux (AMD64, s390x, SuperH), поддержку двух архитектур для некоторых из них и получил многочисленные дополнения и улучшения в декодерах системных вызовов на Linux; разработка strace перешла на git в этот период. С 2009 года strace активно поддерживается Дмитрием Левиным. С тех пор strace получила поддержку архитектур AArch64, ARC, AVR32, Blackfin, Meta, Nios II, OpenSISC 1000, RISC-V, Tile/TileGx, Xtensa.
Последняя версия strace, которая имела некоторый (очевидно, мертвый) [10] код для операционных систем, отличных от Linux, была 4.6, выпущенная в марте 2011 года. [11] В версии strace 4.7, выпущенной в мае 2012 года, [12] весь код, не относящийся к Linux, был удален; [13] начиная с strace 4.13, [14] проект следует графику выпуска ядра Linux, а начиная с версии 5.0, [15] он также следует схеме версионирования Linux.
В 2012 году strace также получила поддержку трассировки пути и декодирования пути дескриптора файла. [16] В августе 2014 года был выпущен strace 4.9, [17] [18] в котором была добавлена поддержка печати трассировок стека. В декабре 2016 года [19] [20] была реализована функция внедрения ошибок системных вызовов .
История версий
Использование и особенности
Наиболее распространенное использование — запуск программы с помощью strace, которая выводит список системных вызовов, выполненных программой. Это полезно, если программа постоянно падает или ведет себя не так, как ожидалось; например, использование strace может показать, что программа пытается получить доступ к файлу, который не существует или не может быть прочитан.
Альтернативное применение — использовать -p
флаг для присоединения к запущенному процессу. Это полезно, если процесс перестал отвечать, и может показать, например, что процесс блокируется при попытке установить сетевое соединение.
Среди прочих возможностей strace позволяет:
- Указание фильтра имен системных вызовов, которые следует отслеживать (с помощью
-e trace=
параметра): по имени, например, clone,fork,vfork ; с использованием одной из предопределенных групп, например %ipc или %file ; или (начиная с версии strace 4.17) с использованием синтаксиса регулярных выражений, например .-e trace=/clock_.*
- Указание списка путей для трассировки (
-P /etc/ld.so.cache
например). - Указание списка файловых дескрипторов, ввод-вывод которых должен быть выгружен (
-e read=
и -e write=
параметры). - Подсчет времени выполнения системного вызова и количества ( параметры
-T
, -c
, -C
, и -w
; -U
параметр позволяет выводить дополнительную информацию, например минимальное и максимальное время выполнения системного вызова). - Печать относительных или абсолютных временных меток (
-t
и -r
опции). - Изменение выполняемых системных вызовов ( опция): изменение возвращаемого значения ( ; начиная с версии strace 4.16) и кода ошибки ( ; начиная с версии strace 4.15) указанных системных вызовов, внедрение сигналов ( ; начиная с версии strace 4.16), задержек ( и ; начиная с версии strace 4.22) и изменение данных, на которые указывают аргументы системных вызовов ( и ; начиная с версии strace 5.11) при их выполнении.
-e inject=syscall specification:tampering specification
:retval=
:error=
:signal=
:delay_enter=
:delay_exit=
:poke_enter=
:poke_exit=
- Извлечение информации о дескрипторах файлов (включая сокеты,
-y
опция; -yy
опция предоставляет некоторую дополнительную информацию, такую как адреса конечных точек для сокетов, пути и основные/дополнительные номера устройств для файлов). - Печать трассировок стека, включая (начиная с версии strace 4.21) разборку символов (
-k
опция). - Фильтрация по возвращаемому статусу системного вызова (
-e status=
опция; начиная с версии strace 5.2 [примечание 3] ). - Выполнить преобразование идентификаторов потоков, процессов, групп процессов и сеансов, появляющихся в трассировке, в пространство имен PID strace (
--pidns-translation
опция; начиная с strace 5.9). - Декодирование контекстной информации SELinux , связанной с процессами, файлами и дескрипторами (
--secontext
опция; начиная с strace 5.12).
strace поддерживает декодирование аргументов некоторых классов команд ioctl , таких как BTRFS_* , V4L2_* , DM_* , NSFS_* , MEM* , EVIO* , KVM_* и некоторых других; он также поддерживает декодирование различных протоколов netlink .
Так как strace детализирует только системные вызовы, он не может быть использован для обнаружения такого количества проблем, как отладчик кода, такой как GNU Debugger (gdb). Однако он проще в использовании, чем отладчик кода, и является очень полезным инструментом для системных администраторов. Он также используется исследователями для генерации трассировок системных вызовов для последующего воспроизведения системных вызовов . [66] [67] [68]
Примеры
Ниже приведен пример типичного вывода команды strace
:
пользователь@сервер:~$ 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 (флаги FD_CLOEXEC) getdents64(3, /* 18 записей */, 4096) = 496 getdents64(3, /* 0 записей */, 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 запись(1, "autofs\nbackups\ncache\nflexlm\ngames"..., 86autofsA
Приведенный выше фрагмент — лишь малая часть вывода strace при запуске команды ' ls '. Он показывает, что текущий рабочий каталог открывается, проверяется и извлекается его содержимое. Полученный список имен файлов записывается в стандартный вывод.
Похожие инструменты
Различные операционные системы имеют другие похожие или связанные инструменты инструментирования , предлагающие похожие или более продвинутые функции; некоторые из инструментов (хотя и с одинаковым или похожим названием) могут использовать совершенно разные рабочие механизмы, что приводит к разным наборам функций или результатам. Такие инструменты включают в себя следующее:
- В Linux есть ltrace , который может отслеживать библиотечные и системные вызовы, xtrace , который может отслеживать программы X Window System , [69] SystemTap , perf , trace-cmd и KernelShark , которые расширяют ftrace .
- AIX обеспечивает управление фермой
- HP-UX предлагает команду Tusc
- Solaris / Illumos имеет ферму и DTrace
- UnixWare предоставляет команду truss
- FreeBSD предоставляет команду truss , ktrace и DTrace
- NetBSD предоставляет ktrace и DTrace
- OpenBSD использует ktrace и kdump
- macOS предоставляет ktrace (10.4 и более ранние версии), DTrace (из Solaris) и связанный с ним dtruss в 10.5 и более поздних версиях. [70]
- В Microsoft Windows есть похожая утилита под названием StraceNT, написанная Панкаджем Гаргом [71], и похожая утилита на основе графического интерфейса пользователя под названием Process Monitor , разработанная Sysinternals .
Смотрите также
Примечания
- ^ Однако декодирование сообщений об ошибках системы выполняется в соответствии с текущей локалью, начиная со strace 4.22. [3]
- ^ Тестовый набор распространяется по лицензии GPL v2.0+ .
- ^ Его сокращение для отображения только успешных вызовов,
-z
option, изначально было добавлено в strace 4.5, но никогда не было документировано, поскольку работало неправильно.
Ссылки
- ^ "Выпуск 6.11". 15 сентября 2024 г. Получено 26 сентября 2024 г.
- ^ "Проект с открытым исходным кодом strace на Open Hub". Openhub.net . Получено 23.11.2021 .
- ^ Дмитрий В. Левин (01.04.2018). "[PATCH] Добавить поддержку i18n" (список рассылки) . Получено 02.09.2021 .
- ^ Дмитрий В. Левин (15.12.2018). "I: изменение лицензии strace на лицензию copyleft" (список рассылки) . Получено 02.09.2021 .
- ↑ Пол Краненбург (2 марта 1992 г.). "Strace - альтернативный трассировщик системных вызовов". Группа новостей : comp.sources.sun.
- ↑ Бранко Ланкестер (5 ноября 1992 г.). «первый выпуск strace для Linux».
- ↑ Бранко Ланкестер (18 июня 1993 г.). «второй выпуск strace для Linux».
- ^ "След". manned.org. 21 июня 1994 года.
- ^ "SUNET's Index of /pub/usenet/ftp.uu.net/comp.sources.misc/volume43/strace". Архивировано из оригинала 11 сентября 2007 г. Получено 14 января 2015 г.
- ^ Денис Власенко (7 февраля 2012 г.). «Как насчет удаления не-Linux кода?».
- ↑ Дмитрий В. Левин (16 марта 2011 г.). «strace 4.6 выпущен».
- ↑ Дмитрий В. Левин (2 мая 2012 г.). «strace 4.7 выпущен».
- ↑ Дмитрий В. Левин (20 апреля 2012 г.). «Заслуживающие внимания изменения в версии 4.7».
- ↑ Дмитрий В. Левин (4 октября 2016 г.). «strace 4.14 выпущен».
- ↑ Дмитрий В. Левин (19 марта 2019 г.). «strace 5.0 выпущен».
- ↑ Дмитрий В. Левин (1 мая 2012 г.). «Заслуживающие внимания изменения в версии 4.7». GitHub .
- ↑ Дмитрий В. Левин (15 августа 2014 г.). «strace 4.9 выпущен».
- ^ Дмитрий В. Левин (15 августа 2014 г.). «Заслуживающие внимания изменения в версии 4.9». GitHub .
- ↑ Дмитрий В. Левин (14 декабря 2016 г.). «выпущена версия strace 4.15».
- ^ Дмитрий В. Левин (14 декабря 2016 г.). «Заслуживающие внимания изменения в версии 4.15». GitHub .
- ^ Дмитрий В. Левин (26.02.2023). "strace 6.2 выпущен".
- ^ Дмитрий В. Левин (12.12.2022). "strace 6.1 выпущен".
- ^ Дмитрий В. Левин (29.10.2022). "strace 6.0 выпущен".
- ^ Дмитрий В. Левин (12.08.2022). "strace 5.19 выпущен".
- ^ Дмитрий В. Левин (18.06.2022). "strace 5.18 выпущен".
- ^ Дмитрий В. Левин (27.03.2022). "strace 5.17 выпущен".
- ^ Дмитрий В. Левин (10.01.2022). "strace 5.16 выпущен".
- ^ Дмитрий В. Левин (01.12.2021). "strace 5.15 выпущен".
- ^ Дмитрий В. Левин (2021-09-02). "strace 5.14 выпущен".
- ^ Дмитрий В. Левин (18.07.2021). "strace 5.13 выпущен".
- ^ Дмитрий В. Левин (2021-04-26). "strace 5.12 выпущен".
- ^ Дмитрий В. Левин (17.02.2021). "strace 5.11 выпущен".
- ^ Дмитрий В. Левин (14.12.2020). "strace 5.10 выпущен".
- ^ Дмитрий В. Левин (24.09.2020). "strace 5.9 выпущен".
- ^ Дмитрий В. Левин (06.08.2020). "strace 5.8 выпущен".
- ^ Дмитрий В. Левин (01.06.2020). "strace 5.7 выпущен".
- ^ Дмитрий В. Левин (07.04.2020). "strace 5.6 выпущен".
- ^ Дмитрий В. Левин (2020-02-06). "strace 5.5 выпущен".
- ^ Дмитрий В. Левин (28.11.2019). "strace 5.4 выпущен".
- ^ Дмитрий В. Левин (25.09.2019). "strace 5.3 выпущен".
- ^ Дмитрий В. Левин (12.07.2019). "strace 5.2 выпущен".
- ^ Дмитрий В. Левин (22.05.2019). "strace 5.1 выпущен".
- ^ Дмитрий В. Левин (19.03.2019). "strace 5.0 выпущен".
- ^ Дмитрий В. Левин (2018-12-26). "strace 4.26 выпущен".
- ^ Дмитрий В. Левин (30.10.2018). "strace 4.25 выпущен".
- ^ Дмитрий В. Левин (14.08.2018). "strace 4.24 выпущен".
- ^ Дмитрий В. Левин (14.06.2018). "strace 4.23 выпущен".
- ^ Дмитрий В. Левин (2018-04-05). "strace 4.22 выпущен".
- ^ Дмитрий В. Левин (13.02.2018). "strace 4.21 выпущен".
- ^ Дмитрий В. Левин (13.11.2017). "выпущен strace 4.20".
- ^ Дмитрий В. Левин (05.09.2017). "strace 4.19 выпущен".
- ^ Дмитрий В. Левин (05.07.2017). "strace 4.18 выпущен".
- ^ Дмитрий В. Левин (24.05.2017). "strace 4.17 выпущен".
- ^ Дмитрий В. Левин (14.02.2017). "strace 4.16 выпущен".
- ^ Дмитрий В. Левин (14.12.2016). "strace 4.15 выпущен".
- ^ Дмитрий В. Левин (2016-10-04). "strace 4.14 выпущен".
- ↑ Дмитрий В. Левин (2016-07-26). "strace 4.13 выпущен".
- ↑ Дмитрий В. Левин (31.05.2016). "strace 4.12 выпущен".
- ^ Дмитрий В. Левин (21.12.2015). "strace 4.11 выпущен".
- ↑ Дмитрий В. Левин (06.03.2015). "strace 4.10 выпущен".
- ^ Дмитрий В. Левин (15.08.2014). "strace 4.9 выпущен".
- ↑ Дмитрий В. Левин (03.06.2013). "strace 4.8 выпущен".
- ↑ Дмитрий В. Левин (2012-05-02). "strace 4.7 выпущен".
- ↑ Дмитрий В. Левин (15.03.2011). "strace 4.6 выпущен".
- ↑ Рик Слэдки (09.07.1994). "v43i075: strace - трассировщик системных вызовов для sunos, linux, svr4, solaris2, часть 01/10".
- ^ Хорки, Джири (2013). "Профилировщик ввода-вывода ioapps и реплейсер трассировок ввода-вывода" . Получено 16 сентября 2013 г.
- ^ Waterland, Amos (2007). "Системный вызов sreplay replayer" . Получено 2013-09-16 .
- ^ Бертон, Ариэль (1998). "Характеристика рабочей нагрузки с использованием облегченной трассировки системных вызовов и повторного выполнения" (PDF) . Получено 16 сентября 2013 г.
- ^ "XTrace - трассировка соединений протокола X". xtrace.alioth.debian.org . Архивировано из оригинала 2014-08-05 . Получено 2014-08-12 .
- ^ "dtrace(1) Страница руководства Mac OS X". Developer.apple.com . Получено 2014-07-23 .
- ^ "IntellectualHeaven - Strace For Windows". intellectualheaven.com . Архивировано из оригинала 5 марта 2016 года . Получено 29 января 2015 года .
Внешние ссылки
- страница проекта strace
- Страница руководства
- Статья OS Reviews на strace
- «Отслеживание системных вызовов с помощью strace», доклад с обзором функций и использования strace, представленный Майклом Керриском на конференции NDC TechTown 2018
- «Современный strace» (источник), доклад с обзором возможностей strace, сделанный Дмитрием Левиным на DevConf.cz 2019