Strace

strace是Linux環境下的一款程序调试工具，用來監察一個應用程序所使用的系統调用及它所接收的系統信息。 最常见的用途是使用strace启动程序，它会打印程序所调用的系统调用列表。这对于程序持续崩溃或行为不符合预期的情况非常有用：例如使用strace可能会显示程序正在尝试访问一个不存在或无法读取的文件。 另一种应用是使用-p标志使之打印一个正在运行进程的系统调用。当一个进程停止响应，该方法可以用于揭示停止响应的原因：例如进程正在尝试进行网络连接时被阻塞。 除此之外，strace还支持以下功能： 指定应该被追踪的系统调用名称的过滤器（通过-e trace=option），过滤器可以是系统调用的名称（如clone, fork, vfork）、预定义的组（如%ipc或%file）或使用正则表达式语法（strace 4.17开始支持）（如-e trace=/clock_.*）。 指定要被追踪的路径列表（如-P /etc/ld.so.cache）。 指定应该被转储I/O的文件描述符列表（-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选项可以提供一些额外信息，比如套接字的端点地址，文件的路径和设备的主/次编号）。 打印堆栈信息（Stack traces），包括符号解缠（ symbol demangling，-k选项；strace 4.21开始支持）。 按系统调用返回状态过滤（-e status=option；strace 5.2开始支持）。 执行线程、进程、进程组和会话ID在跟踪中的翻译成strace的PID命名空间（英语：Linux_namespaces#Process_ID_(pid)）（--pidns-translation选项；strace 5.9开始支持）。 解码与进程、文件和描述符相关的SELinux上下文信息（--secontext选项；strace 5.12开始支持）。 strace支持解码某些类别的ioctl命令的参数，例如BTRFS_*、V4L2_*、DM_*（英语：Device_mapper）、NSFS_*（英语：Linux_namespaces）、MEM*、EVIO*（英语：Evdev）、KVM_*等；它还支持解码各种netlink协议。 由于strace仅详细说明系统调用，因此它无法像代码调试器（如GDB）那样用于检测问题。然而，它比代码调试器更易于使用，对于系统管理员来说是非常有用的工具。研究人员还通过记录系统调用的信息来实现系统调用重放（System call replay）。 以下是使用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 上面仅对在ls命令上运行时strace的输出截取一小部分进行展示。该部分系统调用包括打开当前工作目录、检查并检索其内容、最终将文件名列表写入标准输出。 不同操作系统提供其他类似的调试工具。下面例举了一些类似的调试工具： Linux提供ltrace命令，可以跟踪库调用，xtrace可以跟踪X Window程序，还有SystemTap（英语：SystemTap）、perf，以及扩展ftrace（英语：ftrace）的trace-cmd和KernelShark。 AIX提供truss（英语：truss (Unix)）命令。 HP-UX提供Tusc命令。 Solaris / Illumos有truss和DTrace（英语：DTrace）。 UnixWare（英语：UnixWare）提供truss命令。 FreeBSD提供truss命令、Ktrace（英语：Ktrace）和DTrace。 NetBSD提供Ktrace和DTrace。 OpenBSD使用Ktrace和kdump。 macOS提供Ktrace（10.4及更早版本），DTrace（来自Solaris）和在10.5及更高版本中提供的相关dtruss。 Microsoft Windows有一个类似的工具称为StraceNT，由Pankaj Garg编写，以及一个类似的GUI工具称为Process Monitor（英语：Process_Monitor），由Sysinternals开发。 Horky, Jiri. The ioapps IO profiler and IO traces replayer. 2013 [2013-09-16]. （原始内容存档于2013-11-04）.  Waterland, Amos. The sreplay system call replayer. 2007 [2013-09-16]. （原始内容存档于2016-04-01）.  Burton, Ariel. Workload characterization using lightweight system call tracing and reexecution (PDF). 1998 [2013-09-16]. （原始内容存档 (PDF)于2024-04-23）.  XTrace - trace X protocol connections. xtrace.alioth.debian.org. [2014-08-12]. （原始内容存档于2014-08-05）.  dtrace(1) Mac OS X Manual Page. Developer.apple.com. [2014-07-23]. （原始内容存档于2016-04-05）.  IntellectualHeaven - Strace For Windows. intellectualheaven.com. [2015年1月29日]. （原始内容存档于2016年3月5日）.  starce的幫助文件（页面存档备份，存于互联网档案馆） （英文） lsof gdb Linux程式列表