strace命令
参考博文:强大的strace命令用法详解
概述:strace 作用
让Linux管理员在没有源码的情况下跟踪系统调用(系统调用为用户空间程序向内核请求更高运行权限的服务)。
常显示有关进程的系统调用,用于快速定位系统调用过程中失败的原因。
strace的常用参数及示例
-c 参数
:统计不同系统调用的执行时间,调用次数,错误次数。例如:
root@:~# strace -c uptime
13:02:56 up 5:39, 1 user, load average: 0.18, 0.19, 0.19
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
23.86 0.001079 1079 1 execve
17.40 0.000787 39 20 mmap
12.83 0.000580 48 12 mprotect
12.61 0.000570 57 10 1 openat
7.56 0.000342 48 7 read
5.64 0.000255 23 11 close
5.48 0.000248 22 11 munmap
3.69 0.000167 16 10 fstat
2.06 0.000093 15 6 4 prctl
1.88 0.000085 85 1 write
1.59 0.000072 24 3 brk
1.17 0.000053 26 2 getdents64
0.95 0.000043 43 1 faccessat2
0.82 0.000037 37 1 1 faccessat
0.55 0.000025 25 1 getrandom
0.46 0.000021 21 1 set_tid_address
0.38 0.000017 17 1 ioctl
0.38 0.000017 17 1 rseq
0.35 0.000016 16 1 set_robust_list
0.33 0.000015 15 1 prlimit64
------ ----------- ----------- --------- --------- ----------------
100.00 0.004522 44 102 6 total
还有一堆功能,数不过来,man trace查看
1.strace可以启动要跟踪的进程(strace ls),也可也跟踪已经运行的进程(strace -p PID)。 ctrl+C结束。
例子:
strace -tt -T -v -f -e trace=file -o /data/log/strace.log -s 1024 -p 23489
总结一下:
-tt 在每行行首,显示毫秒级别的时间
-T 显示每次系统调用所花费的时间
-v 对于某些相关调用,把完整的环境变量,文件stat结构等打出来。
-f 跟踪目标进程,以及目标进程创建的所有子进程
-e 控制要跟踪的事件和跟踪行为,比如指定要跟踪的系统调用名称
-e trace=file :跟踪所有以文件名作为参数的系统调用
-e trace=set :仅跟踪指定的系统调用集。如trace=open,close,read,write表示仅跟踪这四个系统调用。
-e trace=process:跟踪涉及过程管理的所有系统调用。比如fork/exec/exit_group
-e trace=network:跟踪所有与网络相关的系统调用。比如socket/sendto/connect
-e trace=signal :跟踪所有与信号相关的系统调用。比如kill/sigaction
-e trace=ipc :跟踪所有与IPC相关的系统调用,比如shmget等
-e trace=desc :和文件描述符相关,比如write/read/select/epoll等
[注意]:绝大多数情况,我们使用上面的组合名字就够了。实在需要跟踪具体的系统调用时,可能需要注意C库实现的差异。比如我们知道创建进程使用的是fork系统调用,但在glibc里面,fork的调用实际上映射到了更底层的clone系统调用。使用strace时,得指定-e trace=clone, 指定-e trace=fork什么也匹配不上。
-o 把strace的输出单独写到指定的文件,而不是stderr
-s 当系统调用的某个参数是字符串时,最多输出指定长度的内容,默认是32个字节
-p 指定要跟踪的进程pid, 要同时跟踪多个pid, 重复多次-p选项即可。
-c 参数:统计不同系统调用的执行时间,调用次数,错误次数。
注意:万能的strace也不是真正的万能。当目标进程卡死在用户态时,strace就没有输出了。这个时候我们需要其他的跟踪手段,比如gdb/perf/SystemTap等