strace
用法及特性
编辑最常见的用途是使用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命名空间(
--pidns-translation
选项;strace 5.9开始支持)。 - 解码与进程、文件和描述符相关的SELinux上下文信息(
--secontext
选项;strace 5.12开始支持)。
strace支持解码某些类别的ioctl命令的参数,例如BTRFS_*、V4L2_*、DM_*、NSFS_*、MEM*、EVIO*、KVM_*等;它还支持解码各种netlink协议。
由于strace仅详细说明系统调用,因此它无法像代码调试器(如GDB)那样用于检测问题。然而,它比代码调试器更易于使用,对于系统管理员来说是非常有用的工具。研究人员还通过记录系统调用的信息来实现系统调用重放(System call replay)。[1][2][3]
示例
编辑
以下是使用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程序,[4]还有SystemTap、perf,以及扩展ftrace的trace-cmd和KernelShark。
- AIX提供truss命令。
- HP-UX提供Tusc命令。
- Solaris / Illumos有truss和DTrace。
- UnixWare提供truss命令。
- FreeBSD提供truss命令、Ktrace和DTrace。
- NetBSD提供Ktrace和DTrace。
- OpenBSD使用Ktrace和kdump。
- macOS提供Ktrace(10.4及更早版本),DTrace(来自Solaris)和在10.5及更高版本中提供的相关dtruss。[5]
- Microsoft Windows有一个类似的工具称为StraceNT,由Pankaj Garg编写,[6]以及一个类似的GUI工具称为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的幫助文件(页面存档备份,存于互联网档案馆) (英文)
参见
编辑这是一篇与Linux相关的小作品。您可以通过编辑或修订扩充其内容。 |