Оригинальный автор(ы) | Пол Краненбург |
---|---|
Разработчик(и) | Дмитрий Левин |
Стабильный релиз | 6.11 [1] / 15 сентября 2024 г. ( 15 сентября 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.io |
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] была реализована функция внедрения ошибок системных вызовов .
Версия | Дата выпуска | Заметные изменения |
---|---|---|
6.2 | 26 февраля 2023 г. [21] | Реализовано разрешение коллизий для перекрывающихся команд ioctl терминала/звука. |
6.1 | 12 декабря 2022 г. [22] | Улучшенное декодирование statx команд syscall и терминала ioctl |
6.0 | 29 октября 2022 г. [23] | Улучшенное декодирование команд setns syscall и PTP_* ioctl |
5.19 | 12 августа 2022 г. [24] | Маркер "(deleted)" несвязанных путей дескрипторов файлов больше не интерпретируется как часть пути; улучшено декодирование системных вызовов arch_prctl , io_uring_register , и prctl ; улучшено декодирование siginfo_t структуры |
5.18 | 18 июня 2022 г. [25] | |
5.17 | 26 марта 2022 г. [26] | Добавлена поддержка нового set_mempolicy_home_node системного вызова в Linux. |
5.16 | 10 января 2022 г. [27] | Добавлена поддержка печати несоответствий контекста SELinux ( --secontext=mismatch опция); добавлена поддержка нового futex_waitv системного вызова в Linux |
5.15 | 1 декабря 2021 г. [28] | |
5.14 | 2 сентября 2021 г. [29] | Добавлена поддержка декодирования новых memfd_secret и quotactl_fd системных вызовов. |
5.13 | 18 июля 2021 г. [30] | Реализована поддержка System Call Vectored ABI на архитектуре IBM POWER |
5.12 | 26 апреля 2021 г. [31] | Добавлена поддержка нового mount_setattr декодирования системных вызовов. |
5.11 | 17 февраля 2021 г. [32] | Добавлена опция для внедрения данных при входе/выходе системного вызова ( poke_enter= и poke_exit= параметры опции --inject ); добавлена поддержка нового epoll_pwait2 декодирования системных вызовов; реализовано декодирование команд FS_IOC_FS[GS]ETXATTR , FS_IOC{,32}_[GS]ETFLAGS , GPIO_* , SIOCADDMULTI , SIOCDELMULTI , SIOCGIFENCAP , SIOCOUTQNSD , SIOCSIFENCAP , SIOCSIFHWBROADCAST , UBI_IOCRPEB , UBI_IOCSPEB , V4L2_BUF_TYPE_META_CAPTURE , V4L2_BUF_TYPE_META_OUTPUT , и VIDIOC_QUERY_EXT_CTRL ioctl |
5.10 | 14 декабря 2020 г. [33] | Поддерживается трассировка стека для неродных личностей при компиляции с помощью libdw ; добавлена поддержка process_madvise декодирования системных вызовов |
5.9 | 24 сентября 2020 г. [34] | Добавлена поддержка close_range декодирования системных вызовов; добавлена поддержка TEE_* декодирования ioctl; реализовано декодирование {msg,msq,sem}info и {msg,msq,sem}id_ds структур, используемых в соответствующих командах системных вызовов System V IPC |
5.8 | 6 августа 2020 г. [35] | Изменен список системных вызовов, охватываемых группой %process , чтобы он содержал системные вызовы, связанные с жизненным циклом процесса: kill , tkill , tgkill , pidfd_send_signal , и rt_sigqueueinfo были добавлены arch_prctl и unshare удалены; добавлена поддержка faccessat2 декодирования системных вызовов; добавлена поддержка LOOP_CONFIGURE декодирования ioctl |
5.7 | 1 июня 2020 г. [36] | |
5.6 | 7 апреля 2020 г. [37] | Добавлены длинные псевдонимы опций, а также возможности для более точной спецификации опций с помощью опций -e quiet / --quiet , -e decode-fds / --decode-fds , --absolute-timestamps , --relative-timestamps , и --syscall-times ; реализованы различные улучшения статистики системных вызовов |
5.5 | 6 февраля 2020 г. [38] | |
5.4 | 28 ноября 2019 г. [39] | |
5.3 | 25 сентября 2019 г. [40] | |
5.2 | 12 июля 2019 г. [41] | |
5.1 | 22 мая 2019 г. [42] | |
5.0 | 19 марта 2019 г. [43] | |
4.26 | 26 декабря 2018 г. [44] | |
4.25 | 30 октября 2018 г. [45] | |
4.24 | 14 августа 2018 г. [46] | |
4.23 | 14 июня 2018 г. [47] | |
4.22 | 5 апреля 2018 г. [48] | |
4.21 | 13 февраля 2018 г. [49] | |
4.20 | 13 ноября 2017 г. [50] | |
4.19 | 5 сентября 2017 г. [51] | |
4.18 | 5 июля 2017 г. [52] | |
4.17 | 24 мая 2017 г. [53] | |
4.16 | 14 февраля 2017 г. [54] | |
4.15 | 14 декабря 2016 г. [55] | |
4.14 | 4 октября 2016 г. [56] | |
4.13 | 26 июля 2016 г. [57] | |
4.12 | 31 мая 2016 г. [58] | |
4.11 | 21 декабря 2015 г. [59] | |
4.10 | 6 марта 2015 г. [60] | |
4.9 | 15 августа 2014 г. [61] | |
4.8 | 3 июня 2013 г. [62] | |
4.7 | 2 мая 2012 г. [63] | Весь код, не относящийся к Linux, был удален. |
4.6 | 15 марта 2011 г. [64] | |
4.5.20 | 13 апреля 2010 г. | Добавлена поддержка новых системных вызовов inotify_init1 , perf_event_open , preadv , pwritev , recvmmsg , rt_tgsigqueueinfo в Linux; -C добавлена опция, объединяющая обычный и сводный вывод; добавлена поддержка архитектуры Tile в Linux |
4.5.19 | 21 октября 2009 г. | Поддержка перешла к Дмитрию Левину; strace теперь завершается с тем же кодом/сигналом выхода, что и трассируемая программа (если она была запущена strace); добавлена поддержка новых системных вызовов accept4 , dup3 , epoll_create1 , eventfd2 , inotify_init1 , pipe2 , signalfd4 в Linux; добавлена поддержка архитектур Blackfin, AVR32 и CRIS в Linux |
4.5.18 | 28 августа 2008 г. | Добавлена поддержка subpage_prot системных вызовов POWER в Linux. |
4.5.17 | 21 июля 2008 г. | -F флаг устарел, так как -f следы vfork в Linux уже давно |
4.5.16 | 3 августа 2007 г. | |
4.5.15 | 16 января 2007 г. | Добавлена поддержка новых системных вызовов *at , inotify* , pselect6 , ppoll и unshare в Linux. |
4.5.14 | 16 января 2007 г. | Номер системного вызова может быть указан в -e спецификации |
4.5.13 | 3 августа 2005 г. | Добавить desc поддержку группы системных вызовов в-e trace= |
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 г. | Декодирование mbind , [sg]et_mempolicy , waitid , fadvise64{,_64} и epoll_* системных вызовов, RTC_* ioctl в Linux |
4.5.7 | 31 августа 2004 г. | |
4.5.6 | 12 июля 2004 г. | Добавлена поддержка 64-битной архитектуры SPARC в Linux. |
4.5.5 | 27 июня 2004 г. | |
4.5.4 | 3 июня 2004 г. | -p подключается ко всем потокам NPTL в Linux только при -f наличии |
4.5.3 | 16 апреля 2004 г. | Добавлена поддержка mq_* системных вызовов в Linux; -p теперь подключается ко всем потокам NPTL в Linux |
4.5.2 | 1 марта 2004 г. | |
4.5.1 | 13 ноября 2003 г. | |
4.5 | 24 сентября 2003 г. | Поддержка перешла к Роланду Макграту; добавлена поддержка x86-64 в Linux с поддержкой отслеживания совместимых процессов; добавлена поддержка архитектур SH и SH64 в Linux; -E добавлена опция |
4.4 | 19 августа 2001 г. | |
4.3.1 | 7 апреля 2001 г. | |
4.3 | 1 апреля 2001 г. | Добавлена поддержка архитектур HP PA/RISC и IA-64 в Linux; добавлена поддержка 32-битных системных вызовов UID/GID в Linux; добавлена поддержка FreeBSD на x86 |
4.2 | 21 января 2000 г. | Добавлена поддержка архитектуры IBM Z на Linux |
4.1 | 26 ноября 1999 г. | Добавлена поддержка архитектуры MIPS в Linux; strace-graph добавлен скрипт |
4.0.1 | 25 июля 1999 г. | |
4.0 | 9 июля 1999 г. | Исправлено 64-битное struct stat декодирование в Linux; обновления Irix 64; обновления Solaris |
3.99.1 | 9 июня 1999 г. | |
3.99 | 27 апреля 1999 г. | Новый сопровождающий, Вихерт Аккерман; добавлена поддержка архитектур IBM POWER, SPARC и ARM в Linux; добавлена поддержка многих системных вызовов в Linux |
3.1 | 1 июня 1996 г. | Добавлена поддержка архитектур Irix OS, m68k и DEC Alpha в Linux; добавлена поддержка -o! синтаксиса опций; добавлена поддержка классов системных вызовов ( file , process ); добавлена поддержка системных вызовов IPC в Sun OS |
3.0 | 9 июля 1994 г. [65] | Первоначальная кроссплатформенная версия Ричарда Слэдки. Включает поддержку -x , -q , -e ( trace , abbrev , verbose , raw , signal , read и write квалификаторов), -c , -i опций |
Наиболее распространенное использование — запуск программы с помощью 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
опции).-e inject=syscall specification:tampering specification
:retval=
:error=
:signal=
:delay_enter=
:delay_exit=
:poke_enter=
:poke_exit=
-y
опция; -yy
опция предоставляет некоторую дополнительную информацию, такую как адреса конечных точек для сокетов, пути и основные/дополнительные номера устройств для файлов).-k
опция).-e status=
опция; начиная с версии strace 5.2 [примечание 3] ).--pidns-translation
опция; начиная с strace 5.9).--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 '. Он показывает, что текущий рабочий каталог открывается, проверяется и извлекается его содержимое. Полученный список имен файлов записывается в стандартный вывод.
Различные операционные системы имеют другие похожие или связанные инструменты инструментирования , предлагающие похожие или более продвинутые функции; некоторые из инструментов (хотя и с одинаковым или похожим названием) могут использовать совершенно разные рабочие механизмы, что приводит к разным наборам функций или результатам. Такие инструменты включают в себя следующее:
-z
option, изначально было добавлено в strace 4.5, но никогда не было документировано, поскольку работало неправильно.