strace 输出
strace 的输出将对应于系统调用或者信号。
系统调用的输出由三个部分组成:
1.系统调用
2. 任何用括号括起来的参数
3.等号后面的调用结果
-1 的退出状态通常表示有错误。
例如:
# strace ls file1 execve("/bin/ls", ["ls", "file1"], [/* 21 vars */]) = 0 brk(0) = 0xadb000 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f516bb79000 ..... close(1) = 0 munmap(0x7f516bb78000, 4096) = 0 close(2) = 0 exit_group(0) = ? +++ exited with 0 +++
花括号用于表示取消引用的 C 结构。
方括号用于表示简单的指针或者值数组。
ltrace 命令
ltrace 命令可用于拦截和记录对共享库的动态调用。
ltrace 命令生成的输出对于某些命令来说可能是压倒性的(特别是如果 -S 选项还用于显示系统调用)。
我们可以将输出集中在程序和某些库列表之间的交互上。
例如,要执行 id -Z 命令并显示对 libselinux.so 模块的调用,请执行:
$ ltrace -l /lib/libselinux.so.1 id -Z is_selinux_enabled(0xc1c7a0, 0x9f291e8, 0xc1affc, 0, -1)a =1 getcon(0x804c2c8, 0xfee80ff4, 0x804b179, 0x804c020, 0)a =0 user_u:system_r:unconfined_t
请记住,我们可以使用 ldd 命令查看程序链接到哪些库。
strace 命令
strace 命令可用于拦截和记录系统调用以及进程接收到的信号。
这允许检查用户空间和内核空间之间的边界层,这对于确定进程失败的原因非常有用。
当源代码不易获得时,使用 strace 分析程序如何与系统交互特别有用。
在
除了在故障排除中的重要性之外,strace 还可以深入了解系统的运行方式。
任何用户都可以跟踪自己正在运行的进程;此外,root 用户可以跟踪任何正在运行的进程。
例如,以下内容可用于添加和跟踪正在运行的 rsyslogd 守护进程:
# strace -p $(pgrep rsyslogd) Process 819 attached select(1, NULL, NULL, NULL, {83009, 275934} ...
strace 命令示例
将跟踪重定向到文件
由于 strace 通常会创建大量输出,因此将其重定向到文件通常很方便。
例如,以下内容可用于启动 bash shell,跟踪任何分叉的子进程,并记录对 files.trace 文件的所有文件访问:
# strace -f -o files.trace -e trace=file bash
统计系统调用次数
运行 ls 命令计算每个系统调用的次数,并打印显示每次调用花费的次数和时间的总数(对于基本分析或者瓶颈隔离很有用):
# strace -c ls
查看进程/守护进程打开的文件
以下示例显示了 OpenSSH 的 sshd 在启动时读取的三个配置文件。
请注意,strace 默认将其输出发送到 STDERR,因此如果我们想将其通过管道传递给 grep 等其他命令以进行进一步更改,则必须适当地重定向输出:
# strace -f -eopen /usr/sbin/sshd 2>&1 | grep ssh
仅跟踪与网络相关的系统调用
当 Netcat 尝试连接到本地 telnetd 服务时,仅跟踪与网络相关的系统调用:
# strace -e trace=network nc localhost 23