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 命令查看程序链接到哪些库。

如何在 Linux 中使用 strace 和 ltrace 命令

strace 命令

strace 命令可用于拦截和记录系统调用以及进程接收到的信号。
这允许检查用户空间和内核空间之间的边界层,这对于确定进程失败的原因非常有用。

当源代码不易获得时,使用 strace 分析程序如何与系统交互特别有用。

除了在故障排除中的重要性之外,strace 还可以深入了解系统的运行方式。
任何用户都可以跟踪自己正在运行的进程;此外,root 用户可以跟踪任何正在运行的进程。
例如,以下内容可用于添加和跟踪正在运行的 rsyslogd 守护进程:

# strace -p $(pgrep rsyslogd)
Process 819 attached
select(1, NULL, NULL, NULL, {83009, 275934}
...
欢迎来到之路教程(on itroad-com)

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
日期:2020-09-17 00:13:58 来源:oir作者:oir