strace - strace
| Původní autoři | Paul Kranenburg |
|---|---|
| Vývojáři | Dmitrij Levin |
| Stabilní uvolnění | 5,14 / 2. září 2021
|
| Úložiště | |
| Napsáno | C |
| Operační systém | Linux |
| Plošina | AArch64 , DEC Alpha , ARC , ARM EABI/OABI , AVR32 , Blackfin , C-SKY, HP PA-RISC , IA-32 , IA-64 , Motorola 68k , Imagination META , MicroBlaze , MIPS , Nios II , OpenRISC , Power ISA 32/64 bit, RISC-V , System/390 / z/Architecture , SuperH 32/64 bit, SPARC 32/64 bit, TILE , TILEPro , TILE-Gx , x86-64 , x32 ABI , Xtensa |
| K dispozici v | Angličtina |
| Typ | Ladění |
| Licence | LGPL v2.1+ |
| webová stránka |
strace |
strace je diagnostický, ladicí a instrukční nástroj uživatelského prostoru pro Linux . Používá se k monitorování a manipulaci s interakcemi mezi procesy a linuxovým jádrem , které zahrnují systémová volání , dodávky signálů a změny stavu procesu. Operaci strace umožňuje funkce jádra známá jako ptrace .
Některé systémy podobné Unixu poskytují další diagnostické nástroje podobné strace, například vazník .
Dějiny
Strace byl původně napsán pro SunOS Paulem Kranenburgem v roce 1991, podle jeho autorských práv, a publikoval na začátku roku 1992, ve svazku tři comp.sources.sun. Počáteční soubor README obsahoval následující:
strace (1) je nástroj pro sledování systémových volání pro systémy Sun (tm) podobně jako trasování programu dodávané společností Sun (1) . strace (1) je užitečný nástroj pro ladění programů, pro které není k dispozici žádný zdroj, který bohužel obsahuje téměř veškerý systémový software dodávaný společností Sun.
Později Branko Lankester přenesl tuto verzi na Linux , svoji verzi vydal v listopadu 1992 a druhé vydání následovalo v roce 1993. Richard Sladkey zkombinoval tyto oddělené verze strace v roce 1993 a v roce 1994 přenesl program na SVR4 a Solaris , což mělo za následek strace 3.0 to bylo oznámeno v comp.sources.misc v polovině roku 1994.
Počínaje rokem 1996 udržoval obrys Wichert Akkerman. Během jeho působení se vývoj strace přesunul do CVS ; byly představeny porty pro FreeBSD a mnoho architektur na Linuxu (včetně ARM, IA-64, MIPS, PA-RISC, PowerPC, s390, SPARC). V roce 2002 bylo břemeno udržování strace přeneseno na Roland McGrath. Od té doby získala strace podporu pro několik nových architektur Linuxu (AMD64, s390x, SuperH), pro některé z nich podporu dvou architektur a získala řadu přírůstků a vylepšení v dekodérech syscalls na Linuxu; vývoj strace v tomto období migroval na git . Od roku 2009 je strace aktivně udržována Dmitrijem Levinem. Strace od té doby získala podporu pro architektury AArch64, ARC, AVR32, Blackfin, Meta, Nios II, OpenSISC 1000, RISC-V, Tile/TileGx, Xtensa.
Poslední verze strace, která měla nějaký (evidentně mrtvý) kód pro operační systémy jiné než Linux, byla 4.6, vydaná v březnu 2011. Ve verzi strace 4.7, vydané v květnu 2012, byl odstraněn veškerý jiný kód než Linux; od verze 4.13 se projekt řídí plánem vydání jádra Linuxu a ve verzi 5.0 také podle schématu verzí Linuxu.
V roce 2012 strace také získala podporu pro trasování cesty a dekódování cesty deskriptoru souboru. V srpnu 2014 byla vydána strace 4.9, kde byla přidána podpora pro tisk trasování zásobníků. V prosinci 2016 byla implementována funkce injekce chyby syscall .
Historie verzí
| Verze | Datum vydání | Významné změny |
|---|---|---|
| 5.14 | 2. září 2021 | |
| 5.13 | 18. července 2021 | |
| 5.12 | 26. dubna 2021 | |
| 5.11 | 17. února 2021 | |
| 5.10 | 14. prosince 2020 | |
| 5.9 | 24. září 2020 | |
| 5.8 | 6. srpna 2020 | |
| 5.7 | 1. června 2020 | |
| 5.6 | 7. dubna 2020 | |
| 5.5 | 6. února 2020 | |
| 5.4 | 28. listopadu 2019 | |
| 5.3 | 25. září 2019 | |
| 5.2 | 12. července 2019 | |
| 5.1 | 22. května 2019 | |
| 5,0 | 19. března 2019 | |
| 4.26 | 26. prosince 2018 | |
| 4.25 | 30. října 2018 | |
| 4.24 | 14. srpna 2018 | |
| 4.23 | 14. června 2018 | |
| 4.22 | 5. dubna 2018 | |
| 4.21 | 13. února 2018 | |
| 4.20 | 13. listopadu 2017 | |
| 4.19 | 5. září 2017 | |
| 4.18 | 5. července 2017 | |
| 4.17 | 24. května 2017 | |
| 4.16 | 14. února 2017 | |
| 4.15 | 14. prosince 2016 | |
| 4.14 | 4. října 2016 | |
| 4.13 | 26. července 2016 | |
| 4.12 | 31. května 2016 | |
| 4.11 | 21. prosince 2015 | |
| 4.10 | 06.03.2015 | |
| 4.9 | 15. srpna 2014 | |
| 4.8 | 3. června 2013 | |
| 4.7 | 2. května 2012 | |
| 4.6 | 15. března 2011 | |
| 4.5.20 | 13. dubna 2010 | |
| 4.5.19 | 21. října 2009 | |
| 4.5.18 | 28. srpna 2008 | Přidána podpora pro subpage_prot syscall specifický pro POWER v Linuxu |
| 4.5.17 | 21. července 2008 |
-F vlajka je zastaralá
|
| 4.5.16 | 3. srpna 2007 | Byla přidána podpora pro nové move_pages, utimensat, signalfd, timerfd, eventfd, getcpu, epoll_pwaitsystémových volání na Linux
|
| 4.5.15 | 16. ledna 2007 | Byla přidána podpora pro nové *at, inotify*, pselect6, ppolla unsharesystémových volání na Linuxu
|
| 4.5.14 | 16. ledna 2007 | Systémové telefonní číslo lze dodat ve -especifikaci
|
| 4.5.13 | 3. srpna 2005 | Přidejte descpodporu skupiny syscall do-e trace=
|
| 4.5.12 | 08.06.2005 | |
| 4.5.11 | 22. března 2005 | |
| 4.5.10 | 13. března 2005 | |
| 4.5.9 | 4. února 2004 | |
| 4.5.8 | 19. října 2004 | Decode mbind, [sg]et_mempolicy, waitid, fadvise64{,_64}a epoll_*systémová volání, RTC_*IOCTL na Linux
|
| 4.5.7 | 31. srpna 2004 | |
| 4.5.6 | 12. července 2004 | Přidána podpora pro 64bitovou architekturu SPARC v systému Linux. |
| 4.5.5 | 27. června 2004 | |
| 4.5.4 | 3. června 2004 | |
| 4.5.3 | 16. dubna 2004 | Přidána podpora pro mq_*syscalls v Linuxu
|
| 4.5.2 | 1. března 2004 | |
| 4.5.1 | 13. listopadu 2003 | |
| 4.5 | 24. září 2003 | Údržba přešla na Rolanda McGratha; přidána podpora x86-64 v Linuxu s podporou trasování kompatibilních procesů; přidána podpora pro architektury SH a SH64 v Linuxu; -Epřidána možnost
|
| 4.4 | 19. srpna 2001 | |
| 4.3.1 | 7. dubna 2001 | |
| 4.3 | 1. dubna 2001 | Přidána podpora pro architektury HP PA/RISC a IA-64 v Linuxu; přidána podpora pro FreeBSD na IA-32 |
| 4.2 | 21. ledna 2000 | Přidána podpora pro architekturu IBM Z v Linuxu |
| 4.1 | 26. listopadu 1999 | Přidána podpora pro architekturu MIPS v Linuxu |
| 4.0.1 | 25. července 1999 | |
| 4,0 | 09.07.1999 | |
| 3.99.1 | 09.06.1999 | |
| 3,99 | 27. dubna 1999 | Nový správce, Wichert Akkerman; přidána podpora pro architektury IBM POWER, SPARC a ARM v Linuxu |
| 3.1 | 1. června 1996 | Přidána podpora pro architektury Irix, m68k a DEC Alpha v Linuxu; přidána podpora pro -o!syntaxi voleb; přidána podpora pro třídy syscall ( file, process)
|
| 3,0 | 09.07.1994 | Počáteční verze pro více platforem od Richarda Sladkeyho. Zahrnuje podporu pro -x, -q, -e( trace, abbrev, verbose, raw, signal, reada writekvalifikační), -c, -ivolby
|
Použití a funkce
Nejběžnějším použitím je spuštění programu pomocí strace, která vytiskne seznam systémových volání provedených programem. To je užitečné, pokud program neustále havaruje nebo se nechová podle očekávání; například pomocí strace může odhalit, že se program pokouší získat přístup k souboru, který neexistuje nebo jej nelze přečíst.
Alternativní aplikací je použít -pvlajku k připojení ke spuštěnému procesu. To je užitečné, pokud proces přestal reagovat a může například odhalit, že proces blokuje při pokusu o připojení k síti.
Strace mimo jiné umožňuje následující:
- Zadání filtru názvů syscall, které by měly být sledovány (prostřednictvím
-e trace=možnosti): podle názvu, jako klon, vidlička, vfork ; pomocí jedné z předdefinovaných skupin, jako je %ipc nebo %soubor ; nebo (od strace 4.17) pomocí syntaxe regulárních výrazů, jako-e trace=/clock_.*. - Zadání seznamu cest, které se mají vysledovat (
-P /etc/ld.so.cachenapříklad). - Zadání seznamu deskriptorů souborů, jejichž I/O by mělo být vyhozeno (
-e read=a-e write=možnosti). - Počítání systémového volání doby provedení a počet (
-T,-c,-Ca-wopcí;-Uvolba umožňuje tisk dalších informací, jako je minimální a maximální syscall době spuštění). - Tisk relativních nebo absolutních časových razítek (
-ta-rmožností). - Manipulace se spuštěnými syscalls ( volitelně): úprava návratu ( ; od strace 4.16) a chybového kódu ( ; od strace 4.15) zadaných syscallů, vkládání signálů ( ; od strace 4.16), zpoždění ( a ; od strace 4.22), a po jejich provedení upravovat data označená argumenty syscall ( a ; od strace 5.11).
-e inject=syscall specification:tampering specification:retval=:error=:signal=:delay_enter=:delay_exit=:poke_enter=:poke_exit= - Extrahování informací o deskriptorech souborů (včetně soketů,
-yvolba;-yyvolba poskytuje některé další informace, jako adresy koncových bodů pro zásuvky, cesty a hlavní/vedlejší čísla zařízení pro soubory). - Tisk trasování zásobníků, včetně (od verze 4.21) demanglování symbolů (
-kvolitelně). - Filtrování podle stavu návratu syscall (
-e status=možnost; od strace 5.2). - Proveďte překlad ID vláken, procesů, skupin procesů a relací, které se objevují ve stopě, do prostoru názvů PID strace (
--pidns-translationvolba; od strace 5.9). - Dekódování kontextových informací SELinux spojených s procesy, soubory a deskriptory (
--secontextvolitelně; od verze 5.12).
strace podporuje dekódování argumentů některých tříd příkazů ioctl , jako jsou BTRFS_* , V4L2_* , DM_* , NSFS_* , MEM* , EVIO* , KVM_* a několik dalších; podporuje také dekódování různých protokolů netlink .
Jelikož strace pouze podrobně popisuje systémová volání, nelze jej použít k detekci tolika problémů jako debugger kódu, jako je GNU Debugger (gdb). Jeho použití je však snazší než ladicí program kódu a je to velmi užitečný nástroj pro správce systému. Výzkumníci jej také používají ke generování trasování systémových volání pro pozdější přehrání systémových volání .
Příklady
Následuje příklad typického výstupu stracepříkazu:
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
Výše uvedený fragment je pouze malou částí výstupu strace při spuštění na příkaz ' ls '. Ukazuje, že aktuální pracovní adresář je otevřen, zkontrolován a načten jeho obsah. Výsledný seznam názvů souborů je zapsán na standardní výstup.
Podobné nástroje
Různé operační systémy obsahují další podobné nebo související instrumentační nástroje, které nabízejí podobné nebo pokročilejší funkce; některé nástroje (i když používají stejný nebo podobný název) mohou používat zcela odlišné pracovní mechanismy, což má za následek různé sady funkcí nebo výsledky. Mezi tyto nástroje patří následující:
- Linux má ltrace, který dokáže sledovat knihovní a systémová volání, xtrace, který dokáže trasovat programy X Window , SystemTap , perf a trace-cmd a KernelShark, které rozšiřují ftrace .
- AIX poskytuje příkaz krovu
- HP-UX nabízí příkaz Tusc
- Solaris / Illumos má krov a DTrace
- UnixWare poskytuje příkaz krovu
- FreeBSD poskytuje krovu příkaz, ktrace a DTrace
- NetBSD poskytuje ktrace a DTrace
- OpenBSD používá ktrace a kdump
- macOS poskytuje ktrace (10.4 a starší), DTrace (od Solaris) a související dtruss v 10.5 a novějších.
- MS Windows má podobný nástroj s názvem StraceNT, napsaný Pankaj Garg, a podobný nástroj na bázi GUI s názvem Process Monitor , vyvinutý společností Sysinternals .
Viz také
Poznámky
Reference
externí odkazy
- stránka projektu strace
- Manuální stránka
- Článek recenze OS o strace
- „System Call Tracing with strace“ , přednáška s přehledem funkcí a využití strace, kterou vytvořil Michael Kerrisk na NDC TechTown 2018
- „Modern strace“ ( zdroj ), povídání s přehledem funkcí strace, které přednesl Dmitrij Levin na DevConf.cz 2019