【strace命令】

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等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值