strace

strace is a diagnostic, debugging and instructional userspace utility for Linux. It is used to monitor and tamper with interactions between processes and the Linux kernel, which include system calls, signal deliveries, and changes of process state. The operation of strace is made possible by the kernel feature known as ptrace.

strace
Original author(s)Paul Kranenburg
Developer(s)Dmitry Levin
Stable release
5.10[1] / December 14, 2020 (2020-12-14)
Repository
Written inC[2]
Operating systemLinux
PlatformAArch64, 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
Available inEnglish
TypeDebugging
LicenseLGPL v2.1+
Websitestrace.io

Some Unix-like systems provide other diagnostic tools similar to strace, such as truss.

History

Strace was originally written for SunOS by Paul Kranenburg in 1991, according to its copyright notice, and published early in 1992, in the volume three of comp.sources.sun. The initial README file contained the following:[3]

strace(1) is a system call tracer for Sun(tm) systems much like the Sun supplied program trace(1). strace(1) is a useful utility to sort of debug programs for which no source is available which unfortunately includes almost all of the Sun supplied system software.

Later, Branko Lankester ported this version to Linux, releasing his version in November 1992 with the second release following in 1993.[4][5] Richard Sladkey combined these separate versions of strace in 1993, and ported the program to SVR4 and Solaris in 1994,[6] resulting in strace 3.0 that was announced in comp.sources.misc in mid-1994.[7]

Beginning in 1996, strace was maintained by Wichert Akkerman. During his tenure, strace development migrated to CVS; ports to FreeBSD and many architectures on Linux (including ARM, IA-64, MIPS, PA-RISC, PowerPC, s390, SPARC) were introduced. In 2002, the burden of strace maintainership was transferred to Roland McGrath. Since then, strace gained support for several new Linux architectures (AMD64, s390x, SuperH), bi-architecture support for some of them, and received numerous additions and improvements in syscalls decoders on Linux; strace development migrated to git during that period. Since 2009, strace is actively maintained by Dmitry Levin. strace gained support for AArch64, ARC, AVR32, Blackfin, Meta, Nios II, OpenSISC 1000, RISC-V, Tile/TileGx, Xtensa architectures since that time.

The last version of strace that had some (evidently dead)[8] code for non-Linux operating systems was 4.6, released in March 2011.[9] In strace version 4.7, released in May 2012,[10] all non-Linux code had been removed;[11] since strace 4.13,[12] the project follows Linux kernel's release schedule, and with the version 5.0,[13] it follows Linux's versioning scheme as well.

In 2012 strace also gained support for path tracing and file descriptor path decoding.[14] In August 2014, strace 4.9 was released,[15][16] where support for stack traces printing was added. In December 2016,[17][18] syscall fault injection feature was implemented.

Version history

Version Release date
5.1014 December 2020[19]
5.924 September 2020[20]
5.86 August 2020[21]
5.71 June 2020[22]
5.67 April 2020[23]
5.56 February 2020[24]
5.428 November 2019[25]
5.325 September 2019[26]
5.212 July 2019[27]
5.122 May 2019[28]
5.019 March 2019[29]
4.2626 December 2018[30]
4.2530 October 2018[31]
4.2414 August 2018[32]
4.2314 June 2018[33]
4.225 April 2018[34]
4.2113 February 2018[35]
4.2013 November 2017[36]
4.195 September 2017[37]
4.185 July 2017[38]
4.1724 May 2017[39]
4.1614 February 2017[40]
4.1514 December 2016[41]
4.144 October 2016[42]
4.1326 July 2016[43]
4.1231 May 2016[44]
4.1121 December 2015[45]
4.106 March 2015[46]
4.915 August 2014[47]
4.83 June 2013[48]
4.72 May 2012[49]
4.615 March 2011[50]
4.5.2013 April 2010
4.5.1921 October 2009
4.5.1828 August 2008
4.5.1721 July 2008
4.5.163 August 2007
4.5.1516 January 2007
4.5.1416 January 2007
4.5.133 August 2005
4.5.128 June 2005
4.5.1122 March 2005
4.5.1013 March 2005
4.5.94 February 2004
4.5.819 October 2004
4.5.731 August 2004
4.5.612 July 2004
4.5.527 June 2004
4.5.43 June 2004
4.5.316 April 2004
4.5.21 March 2004
4.5.113 November 2003
4.524 September 2003
4.419 August 2001
4.3.17 April 2001
4.31 April 2001
4.221 January 2000
4.126 November 1999
4.0.125 July 1999
4.09 July 1999
3.99.19 June 1999
3.9927 April 1999
3.11 June 1996
3.09 July 1994[51]

Usage and features

The most common use is to start a program using strace, which prints a list of system calls made by the program. This is useful if the program continually crashes, or does not behave as expected; for example using strace may reveal that the program is attempting to access a file which does not exist or cannot be read.

An alternative application is to use the -p flag to attach to a running process. This is useful if a process has stopped responding, and might reveal, for example, that the process is blocking whilst attempting to make a network connection.

Among other features, strace allows the following:

  • Specifying a filter of syscall names that should be traced (via the -e trace= option): by name, like clone,fork,vfork; using one of the predefined groups, like %ipc or %file; or (since strace 4.17) using regular expression syntax, like -e trace=/clock_.*.
  • Specifying a list of paths to be traced (-P /etc/ld.so.cache, for example).
  • Specifying a list of file descriptors whose I/O should be dumped (-e read= and -e write= options).
  • Counting syscall execution time and count (-T, -c, -C, and -w options).
  • Printing relative or absolute time stamps (-t and -r options).
  • Modifying return and error code of the specified syscalls, and inject signals upon their execution (since strace 4.15, -e inject= option).
  • Extracting information about file descriptors (including sockets, -y option).
  • Printing stack traces, including (since strace 4.21) symbol demangling (-k option).
  • Filtering by syscall return status (-e status= option; since strace 5.2[52]).

strace supports decoding of arguments of some classes of ioctl commands, such as BTRFS_*, V4L2_*, DM_*, NSFS_*, MEM*, EVIO*, KVM_*, and several others.

As strace only details system calls, it cannot be used to detect as many problems as a code debugger such as GNU Debugger (gdb). It is, however, easier to use than a code debugger, and is a very useful tool for system administrators. It is also used by researchers to generate system call traces for later system call replay.[53][54][55]

Examples

The following is an example of typical output of the strace command:

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

The above fragment is only a small part of the output of strace when run on the 'ls' command. It shows that the current working directory is opened, inspected and its contents retrieved. The resulting list of file names is written to standard output.

Similar tools

Different operating systems feature other similar or related instrumentation tools, offering similar or more advanced features; some of the tools (although using the same or a similar name) may use completely different work mechanisms, resulting in different feature sets or results. Such tools include the following:

See also

References

  1. "strace 5.10 released" (Mailing list). 2020-12-14. Retrieved 2020-12-14.
  2. https://openhub.net/p/strace
  3. Paul Kranenburg (March 2, 1992). "Strace - an alternative syscall tracer". Newsgroup: comp.sources.sun.
  4. Branko Lankester (November 5, 1992). "first Linux release of strace".
  5. Branko Lankester (June 18, 1993). "second Linux release of strace".
  6. "strace". manned.org. June 21, 1994.
  7. "SUNET's Index of /pub/usenet/ftp.uu.net/comp.sources.misc/volume43/strace". Retrieved January 14, 2015.
  8. Denys Vlasenko (February 7, 2012). "How about removing non-Linux code?".
  9. Dmitry V. Levin (March 16, 2011). "strace 4.6 released".
  10. Dmitry V. Levin (May 2, 2012). "strace 4.7 released".
  11. Dmitry V. Levin (April 20, 2012). "Noteworthy changes in release 4.7".
  12. Dmitry V. Levin (October 4, 2016). "strace 4.14 released".
  13. Dmitry V. Levin (March 19, 2019). "strace 5.0 released".
  14. Dmitry V. Levin (May 1, 2012). "Noteworthy changes in release 4.7".
  15. Dmitry V. Levin (August 15, 2014). "strace 4.9 released".
  16. Dmitry V. Levin (August 15, 2014). "Noteworthy changes in release 4.9".
  17. Dmitry V. Levin (December 14, 2016). "strace 4.15 released".
  18. Dmitry V. Levin (December 14, 2016). "Noteworthy changes in release 4.15".
  19. Dmitry V. Levin (2020-12-14). "strace 5.10 released".
  20. Dmitry V. Levin (2020-09-24). "strace 5.9 released".
  21. Dmitry V. Levin (2020-08-06). "strace 5.8 released".
  22. Dmitry V. Levin (2020-06-01). "strace 5.7 released".
  23. Dmitry V. Levin (2020-04-07). "strace 5.6 released".
  24. Dmitry V. Levin (2020-02-06). "strace 5.5 released".
  25. Dmitry V. Levin (2019-11-28). "strace 5.4 released".
  26. Dmitry V. Levin (2019-09-25). "strace 5.3 released".
  27. Dmitry V. Levin (2019-07-12). "strace 5.2 released".
  28. Dmitry V. Levin (2019-05-22). "strace 5.1 released".
  29. Dmitry V. Levin (2019-03-19). "strace 5.0 released".
  30. Dmitry V. Levin (2018-12-26). "strace 4.26 released".
  31. Dmitry V. Levin (2018-10-30). "strace 4.25 released".
  32. Dmitry V. Levin (2018-08-14). "strace 4.24 released".
  33. Dmitry V. Levin (2018-06-14). "strace 4.23 released".
  34. Dmitry V. Levin (2018-04-05). "strace 4.22 released".
  35. Dmitry V. Levin (2018-02-13). "strace 4.21 released".
  36. Dmitry V. Levin (2017-11-13). "strace 4.20 released".
  37. Dmitry V. Levin (2017-09-05). "strace 4.19 released".
  38. Dmitry V. Levin (2017-07-05). "strace 4.18 released".
  39. Dmitry V. Levin (2017-05-24). "strace 4.17 released".
  40. Dmitry V. Levin (2017-02-14). "strace 4.16 released".
  41. Dmitry V. Levin (2016-12-14). "strace 4.15 released".
  42. Dmitry V. Levin (2016-10-04). "strace 4.14 released".
  43. Dmitry V. Levin (2016-07-26). "strace 4.13 released".
  44. Dmitry V. Levin (2016-05-31). "strace 4.12 released".
  45. Dmitry V. Levin (2015-12-21). "strace 4.11 released".
  46. Dmitry V. Levin (2015-03-06). "strace 4.10 released".
  47. Dmitry V. Levin (2014-08-15). "strace 4.9 released".
  48. Dmitry V. Levin (2013-06-03). "strace 4.8 released".
  49. Dmitry V. Levin (2012-05-02). "strace 4.7 released".
  50. Dmitry V. Levin (2011-03-15). "strace 4.6 released".
  51. Rick Sladkey (1994-07-09). "v43i075: strace - system call tracer for sunos, linux, svr4, solaris2, Part01/10".
  52. Its shorthand for showing only successful calls, -z option, was originally added in strace 4.5, but was never documented as it did not work properly.
  53. Horky, Jiri (2013). "The ioapps IO profiler and IO traces replayer". Retrieved 2013-09-16.
  54. Waterland, Amos (2007). "The sreplay system call replayer". Retrieved 2013-09-16.
  55. Burton, Ariel (1998). "Workload characterization using lightweight system call tracing and reexecution" (PDF). Retrieved 2013-09-16.
  56. "XTrace - trace X protocol connections". xtrace.alioth.debian.org. Retrieved 2014-08-12.
  57. "dtrace(1) Mac OS X Manual Page". Developer.apple.com. Retrieved 2014-07-23.
  58. "IntellectualHeaven - Strace For Windows". intellectualheaven.com. Retrieved 29 January 2015.
This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.