след
Оригинальный автор(ы) | Пол Краненбург |
---|---|
Разработчик(и) | Дмитрий Левин |
Стабильная версия | 6.10 [1]
/ 21 июля 2024 г |
Репозиторий | |
Написано в | С [2] |
Операционная система | Линукс |
Платформа | AArch64 , DEC Alpha , ARC , ARM EABI/OABI , AVR32 , Blackfin , C-SKY, HP PA-RISC , IA-32 , IA-64 , LoongArch , Motorola 68k , Imagination META , MicroBlaze , MIPS , Nios II , OpenRISC , Power ISA 32/64 бит, RISC-V , System/390 / z/Architecture , SuperH 32/64 бит, SPARC 32/64 бит, TILE , TILEPro , TILE-Gx , x86-64 , x32 ABI , Xtensa |
Доступно в | Английский [примечание 1] |
Тип | Отладка |
Лицензия | LGPL v2.1+ [примечание 2] [4] |
Веб-сайт | след |
strace — это диагностическая, отладочная и обучающая утилита пользовательского пространства для Linux . Он используется для мониторинга и вмешательства во взаимодействие между процессами и ядром Linux , которое включает в себя системные вызовы , доставку сигналов и изменения состояния процесса. Работа strace стала возможной благодаря функции ядра, известной как ptrace .
Некоторые Unix-подобные системы предоставляют другие диагностические инструменты, подобные strace, например truss .
История
[ редактировать ]Первоначально Strace был написан для SunOS Полом Краненбургом в 1991 году, согласно уведомлению об авторских правах, и опубликован в начале 1992 года в третьем томе comp.sources.sun. Исходный файл README содержал следующее: [5]
strace(1) — средство трассировки системных вызовов для систем Sun(tm), очень похожее на программу, поставляемую Sun. трассировка(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 поддерживал Вихерт Аккерман. Во время его пребывания в должности разработка strace перешла на CVS ; были представлены порты для FreeBSD и многих архитектур Linux (включая ARM, IA-64, MIPS, PA-RISC, PowerPC, s390, SPARC). В 2002 году бремя поддержки strace было передано Роланду МакГрату. С тех пор 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] начиная с версии 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=
вариант): по имени, например клон, вилка, вфорк ; используя одну из предопределенных групп, например %ipc или %файл ; или (начиная с strace 4.17) используя синтаксис регулярных выражений, например-e trace=/clock_.*
. - Указание списка путей для трассировки (
-P /etc/ld.so.cache
, например). - Указание списка файловых дескрипторов, ввод-вывод которых должен быть выгружен (
-e read=
и-e write=
параметры). - Подсчет времени выполнения системного вызова и количества (
-T
,-c
,-C
, и-w
параметры;-U
опция позволяет печатать дополнительную информацию, например минимальное и максимальное время выполнения системного вызова). - Печать отметок относительного или абсолютного времени (
-t
и-r
параметры). - Вмешательство в выполняемые системные вызовы (
-e inject=syscall specification:tampering specification
опция): изменение возврата (:retval=
; начиная со strace 4.16) и код ошибки (:error=
; начиная со strace 4.15) указанных системных вызовов, вставляйте сигналы (:signal=
; начиная со strace 4.16), задержки (:delay_enter=
и:delay_exit=
; начиная с strace 4.22) и изменять данные, на которые указывают аргументы системного вызова (:poke_enter=
и:poke_exit=
; начиная со strace 5.11) при их выполнении. - Извлечение информации о файловых дескрипторах (включая сокеты,
-y
вариант;-yy
Опция предоставляет некоторую дополнительную информацию, например адреса конечных точек для сокетов, пути и старшие/дополнительные номера устройств для файлов). - Печать трассировок стека, включая (начиная со strace 4.21) расчленение символов (
-k
вариант). - Фильтрация по статусу возврата системного вызова (
-e status=
вариант; начиная с версии 5.2 [примечание 3] ). - Выполните перевод идентификаторов потоков, процессов, групп процессов и сеансов, появляющихся в трассировке, в пространство имен PID strace (
--pidns-translation
вариант; начиная со strace 5.9). - Декодирование контекстной информации SELinux , связанной с процессами, файлами и дескрипторами (
--secontext
вариант; начиная со strace 5.12).
strace поддерживает декодирование аргументов некоторых классов команд ioctl , таких как BTRFS_* , V4L2_* , DM_* , NSFS_* , MEM* , EVIO* , KVM_* и некоторых других; он также поддерживает декодирование различных протоколов сетевых каналов .
Поскольку strace детализирует только системные вызовы, ее нельзя использовать для обнаружения такого количества проблем, как отладчик кода, такой как GNU Debugger (gdb). Однако его проще использовать, чем отладчик кода, и он является очень полезным инструментом для системных администраторов. Он также используется исследователями для создания трассировок системных вызовов для последующего воспроизведения системных вызовов . [66] [67] [68]
Примеры
[ редактировать ]Ниже приведен пример типичного вывода strace
команда:
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 . Он показывает, что текущий рабочий каталог открыт, проверен и его содержимое получено. Результирующий список имен файлов записывается в стандартный вывод.
Похожие инструменты
[ редактировать ]В разных операционных системах есть другие похожие или связанные инструменты , предлагающие аналогичные или более продвинутые функции; некоторые инструменты (хотя и используют одно и то же или похожее имя) могут использовать совершенно разные механизмы работы, что приводит к разным наборам функций или результатам. К таким инструментам относятся следующие:
- В Linux есть ltrace , который может отслеживать библиотечные и системные вызовы, xtrace , который может отслеживать X Window System , программы [69] SystemTap , perf , а также трассировка-cmd и KernelShark , которые расширяют ftrace .
- AIX предоставляет фермы команда
- HP-UX предлагает Затем команда
- Solaris / Illumos имеет ферму и DTrace.
- UnixWare предоставляет фермы команда
- FreeBSD предоставляет фермы команда , 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
опция изначально была добавлена в strace 4.5, но никогда не документировалась, поскольку не работала должным образом.
Ссылки
[ редактировать ]- ^ «Релиз 6.10» . 21 июля 2024 г. Проверено 28 июля 2024 г.
- ^ «Проект с открытым исходным кодом strace на Open Hub» . Openhub.net . Проверено 23 ноября 2021 г.
- ^ Дмитрий В. Левин (01.04.2018). «[ИСПРАВЛЕНИЕ] Добавить поддержку i18n» (список рассылки) . Проверено 02 сентября 2021 г.
- ^ Дмитрий В. Левин (15 декабря 2018 г.). «Я: изменение лицензии strace на лицензию с авторским левом» (список рассылки) . Проверено 02 сентября 2021 г.
- ^ Пол Краненбург (2 марта 1992 г.). «Strace — альтернативный трассировщик системных вызовов» . Группа новостей : comp.sources.sun .
- ^ Бранко Ланкестер (5 ноября 1992 г.). «первый выпуск strace для Linux» .
- ^ Бранко Ланкестер (18 июня 1993 г.). «второй выпуск strace для Linux» .
- ^ «след» . manned.org. 21 июня 1994 года.
- ^ «Индекс SUNET /pub/usenet/ftp.uu.net/comp.sources.misc/volume43/strace» . Архивировано из оригинала 11 сентября 2007 года . Проверено 14 января 2015 г.
- ^ Денис Власенко (7 февраля 2012 г.). «Как насчет удаления кода, отличного от Linux?» .
- ^ Левин Дмитрий Владимирович (16 марта 2011 г.). «Выпущена версия 4.6» .
- ^ Левин Дмитрий Владимирович (2 мая 2012 г.). «Выпущена версия 4.7» .
- ^ Левин Дмитрий Владимирович (20 апреля 2012 г.). «Примечательные изменения в версии 4.7» .
- ^ Левин Дмитрий Владимирович (4 октября 2016 г.). «Выпущена версия 4.14» .
- ^ Левин Дмитрий Владимирович (19 марта 2019 г.). «выпущена strace 5.0» .
- ^ Левин Дмитрий Владимирович (1 мая 2012 г.). «Примечательные изменения в версии 4.7» . Гитхаб .
- ^ Левин Дмитрий Владимирович (15 августа 2014 г.). «Выпущена версия 4.9» .
- ^ Левин Дмитрий Владимирович (15 августа 2014 г.). «Примечательные изменения в версии 4.9» . Гитхаб .
- ^ Левин Дмитрий Владимирович (14 декабря 2016 г.). «Выпущена версия 4.15» .
- ^ Левин Дмитрий Владимирович (14 декабря 2016 г.). «Примечательные изменения в версии 4.15» . Гитхаб .
- ^ Левин Дмитрий Владимирович (26 февраля 2023 г.). «Выпущена версия 6.2» .
- ^ Левин Дмитрий Владимирович (12 декабря 2022 г.). «Выпущена версия 6.1» .
- ^ Дмитрий В. Левин (29 октября 2022 г.). «выпущена strace 6.0» .
- ^ Левин Дмитрий Владимирович (12 августа 2022 г.). «Выпущена версия 5.19» .
- ^ Левин Дмитрий Владимирович (18 июня 2022 г.). «Выпущена версия 5.18» .
- ^ Левин Дмитрий Владимирович (27 марта 2022 г.). «выпущена версия 5.17» .
- ^ Левин Дмитрий Владимирович (10 января 2022 г.). «Выпущена версия 5.16» .
- ^ Левин Дмитрий Владимирович (01 декабря 2021 г.). «выпущена версия 5.15» .
- ^ Дмитрий В. Левин (02.09.2021). «выпущена версия 5.14» .
- ^ Левин Дмитрий Владимирович (18 июля 2021 г.). «Выпущена версия 5.13» .
- ^ Левин Дмитрий Владимирович (26 апреля 2021 г.). «Выпущена версия 5.12» .
- ^ Левин Дмитрий Владимирович (17 февраля 2021 г.). «Выпущена версия 5.11» .
- ^ Дмитрий В. Левин (14 декабря 2020 г.). «Выпущена версия 5.10» .
- ^ Левин Дмитрий Владимирович (24 сентября 2020 г.). «Выпущена версия 5.9» .
- ^ Дмитрий В. Левин (06.08.2020). «выпущена версия 5.8» .
- ^ Левин Дмитрий Владимирович (01.06.2020). «выпущена версия 5.7» .
- ^ Левин Дмитрий В. (07.04.2020). «Выпущена версия 5.6» .
- ^ Левин Дмитрий Владимирович (06.02.2020). «выпущена версия 5.5» .
- ^ Дмитрий В. Левин (28.11.2019). «Выпущена версия 5.4» .
- ^ Левин Дмитрий Владимирович (25 сентября 2019 г.). «Выпущена версия 5.3» .
- ^ Левин Дмитрий Владимирович (12 июля 2019 г.). «Выпущена версия 5.2» .
- ^ Левин Дмитрий Владимирович (22 мая 2019 г.). «Выпущена версия 5.1» .
- ^ Левин Дмитрий Владимирович (19 марта 2019 г.). «выпущена strace 5.0» .
- ^ Дмитрий В. Левин (26 декабря 2018 г.). «Выпущена версия 4.26» .
- ^ Дмитрий В. Левин (30.10.2018). «выпущена версия 4.25» .
- ^ Левин Дмитрий Владимирович (14 августа 2018 г.). «Выпущена версия 4.24» .
- ^ Левин Дмитрий Владимирович (14 июня 2018 г.). «Выпущена версия 4.23» .
- ^ Дмитрий В. Левин (05.04.2018). «Выпущена версия 4.22» .
- ^ Левин Дмитрий Владимирович (13 февраля 2018 г.). «Выпущена версия 4.21» .
- ^ Дмитрий В. Левин (13.11.2017). «Выпущена версия 4.20» .
- ^ Дмитрий В. Левин (05.09.2017). «Выпущена версия 4.19» .
- ^ Дмитрий В. Левин (05.07.2017). «Выпущена версия 4.18» .
- ^ Дмитрий В. Левин (24 мая 2017 г.). «выпущена версия 4.17» .
- ^ Левин Дмитрий Владимирович (14 февраля 2017 г.). «Выпущена версия 4.16» .
- ^ Дмитрий В. Левин (14 декабря 2016 г.). «Выпущена версия 4.15» .
- ^ Дмитрий В. Левин (04.10.2016). «Выпущена версия 4.14» .
- ^ Дмитрий В. Левин (26 июля 2016 г.). «Выпущена версия 4.13» .
- ^ Дмитрий В. Левин (31 мая 2016 г.). «Выпущена версия 4.12» .
- ^ Дмитрий В. Левин (21 декабря 2015 г.). «выпущена версия 4.11» .
- ^ Дмитрий В. Левин (06.03.2015). «Выпущена версия 4.10» .
- ^ Дмитрий В. Левин (15 августа 2014 г.). «Выпущена версия 4.9» .
- ^ Дмитрий В. Левин (03.06.2013). «Выпущена версия 4.8» .
- ^ Дмитрий В. Левин (2 мая 2012 г.). «Выпущена версия 4.7» .
- ^ Дмитрий В. Левин (15 марта 2011 г.). «Выпущена версия 4.6» .
- ^ Рик Слэдки (9 июля 1994 г.). «v43i075: strace — трассировщик системных вызовов для sunos, linux, svr4, Solaris2, Part01/10» .
- ^ Горький, Иржи (2013). «Профилировщик ввода-вывода ioapps и проигрыватель трассировок ввода-вывода» . Проверено 16 сентября 2013 г.
- ^ Уотерленд, Амос (2007). «Реплейер системных вызовов sreplay» . Проверено 16 сентября 2013 г.
- ^ Бертон, Ариэль (1998). «Характеристика рабочей нагрузки с использованием облегченной трассировки и повторного выполнения системных вызовов» (PDF) . Проверено 16 сентября 2013 г.
- ^ «XTrace — трассировка соединений по протоколу X» . xtrace.alioth.debian.org . Архивировано из оригинала 5 августа 2014 г. Проверено 12 августа 2014 г.
- ^ «Страница руководства по dtrace(1) Mac OS X» . Разработчик.apple.com . Проверено 23 июля 2014 г.
- ^ «IntellectualHeaven — Strace для Windows» . www.intellectualheaven.com . Архивировано из оригинала 5 марта 2016 года . Проверено 29 января 2015 г.
Внешние ссылки
[ редактировать ]- страница проекта strace
- Страница руководства
- Статья об обзорах ОС на strace
- «Трассировка системных вызовов с помощью strace» , доклад с обзором функций и использования strace, сделанный Майклом Керриском на NDC TechTown 2018.
- «Modern strace» ( источник ), доклад с обзором возможностей strace, сделанный Дмитрием Левиным на DevConf.cz 2019