strace 是咩?

MagicQ 6月前 194

Strace,可能大多是运维都没怎么听说过的,但是其使用场景很多,大到抓报文,小到统计CPU耗时都可以,可以统计到进程的所有系统调用。

usage: strace [-CdffhiqrtttTvVwxxy] [-I n] [-e expr]...
              [-a column] [-o file] [-s strsize] [-P path]...
              -p pid... / [-D] [-E var=val]... [-u username] PROG [ARGS]
   or: strace -c[dfw] [-I n] [-e expr]... [-O overhead] [-S sortby]
              -p pid... / [-D] [-E var=val]... [-u username] PROG [ARGS]

首先我们看其使用方法,strace 参数 参数 参数...  各种参数可用,比tcpdump的可见参数都多了...好玩吧!不过先无视它,记住最简单的用法 strace ls -lh 就行;其中ls -lh 是你自己的脚本/程序,也就是在你要执行的东西前面直接加 strace就行

[root@180 ~]# strace ls -lh
execve("/bin/ls", ["ls", "-lh"], [/* 22 vars */]) = 0
brk(NULL)                               = 0x1f61000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fd103496000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=28476, ...}) = 0
mmap(NULL, 28476, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fd10348f000
close(3)

返回里很多不认识的?没关系。。。找你认识和关心的字眼就行。。。比如说 open(...cache)这是在打开文件等等。。。

接下来缕缕它的可用参数,有没有发现其实很简单:

Output format:  #打印选项
  -a column      alignment COLUMN for printing syscall results (default 40)  #调打印列数的
  -i             print instruction pointer at time of syscall   #这个对指针不了解的直接无视吧,是显示指针信息的
  -o file        send trace output to FILE instead of stderr   #输出调试信息到文件
  -q             suppress messages about attaching, detaching, etc.   #不显示附加状态信息,默认显示
  -r             print relative timestamp   #打印相对时间,默认不显示时间信息,开启后会打印每个系统调用所耗时间
  -s strsize     limit length of print strings to STRSIZE chars (default 32)  #设置打印字符串大小,默认值显示前32位的,这个字符串是程序中会用的,比如说文件名
  -t             print absolute timestamp  #打印绝对时间
  -tt            print absolute timestamp with usecs   #打印微妙级的时间
  -T             print time spent in each syscall   #打印每个系统调用所耗时间,与-t类似,能实现类似的效果,只是显示效果不一样而已
  -x             print non-ascii strings in hex   #转换为ASCII字符串为16进制,可以理解为字库里没有的东西,直接显示成翻译前的东西,正常情况下都是从ascii转为字符显示的
  -xx            print all strings in hex   #用16进制显示所有字符串
  -y             print paths associated with file descriptor arguments    #打印真实文件,open(软连接),会同时打印软连接和真实文件路劲的信息
  -yy            print protocol specific information associated with socket file descriptors    #与-y类似,只是多了对socket file的处理

Statistics:  #统计相关,大部分output选项在与统计参数无需共用
  -c             count time, calls, and errors for each syscall and report summary  #统计CPU和错误信息
  -C             like -c but also print regular output     #-c状态下只显示统计信息,C同时把output内容也打印
  -O overhead    set overhead for tracing syscalls to OVERHEAD usecs   #用另外一种方式来统计耗时
  -S sortby      sort syscall counts by: time, calls, name, nothing (default time)   #默认是耗时大小排序,改用其他东西排序
  -w             summarise syscall latency (default is system time)

Filtering:   #过滤器
  -e expr        a qualifying expression: option=[!]all or option=[!]val1[,val2]...   #类似于tcpdump的filter,支持and/or/!等运算符
     options:    trace, abbrev, verbose, raw, signal, read, write    #比如说过滤open调用,直接 -e open
  -P path        trace accesses to path   #等价于CD path; strace PROG

Tracing:   #调试相关
  -b execve      detach on execve syscall    #直接附加,当主线程要fork子线程的时候会触发相应syscall时,会退出调试,目前只支持execve值
  -D             run tracer process as a detached grandchild, not as parent   #以孙子身份执行附加到进程,默认是以父亲的身份,strace收到退出信号时,进程也会退出,以孙子身份不会影响主进程,PID模式下不支持
  -f             follow forks    # -o 参数下有效,会将子线程的调用信息也打印出来
  -ff            follow forks with output into separate files  # -o 参数下有效,会将每个线程分别打印到文件,文件名是 -o 值的基础上加 .pid
  -I interruptible    #中断选项,Ctrl+c 对主进程(如ls -l)的作用
     1:          no signals are blocked   #不发任何信号,主进程无影响
     2:          fatal signals are blocked while decoding syscall (default)   #主进程收到Ctrl+c信号,非-o参数下用
     3:          fatal signals are always blocked (default if '-o FILE PROG')  #主进程收到Ctrl+c信号,在-o参数下用
     4:          fatal signals and SIGTSTP (^Z) are always blocked   #主进程收到Ctrl+z信号
                 (useful to make 'strace -o FILE PROG' not stop on ^Z)

Startup:
  -E var         remove var from the environment for command   #取消某个环境变量
  -E var=val     put var=val in the environment for command    #附加环境变量
  -p pid         trace process with process id PID, may be repeated    #-p进程ID,trace某个进程
  -u username    run command as username handling setuid and/or setgid    #类似于 su -username

Miscellaneous:   #其他杂项
  -d             enable debug output to stderr   #标准输出转换为标准错误  等价于  1>&2
  -v             verbose mode: print unabbreviated argv, stat, termios, etc. args     #debug打印更多信息
  -h             print help message   #。。。
  -V             print version   #。。。

常用的几重场景:

1、统计访问云存储时间消耗情况

#strace -w -c ls /pat
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 98.29    3.319627      553271         6           getdents  #大部分时间消耗在它,问题在read目录的buffer,解决它就好
  0.60    0.020395        2266         9           open
  0.54    0.018398       18398         1           stat
  0.54    0.018107         377        48           write
  0.01    0.000228          12        19           mmap
  0.00    0.000136          11        12           mprotect
  0.00    0.000104         104         1           execve
  0.00    0.000090           8        11           close
  0.00    0.000082           8        10           fstat
  0.00    0.000072          10         7           read
  0.00    0.000065           9         7         7 access
  0.00    0.000049          10         5           brk
  0.00    0.000028          14         2         2 statfs
  0.00    0.000018          18         1           munmap
  0.00    0.000018           9         2           ioctl
  0.00    0.000013           7         2           rt_sigaction
  0.00    0.000007           7         1           rt_sigprocmask
  0.00    0.000007           7         1           getrlimit
  0.00    0.000007           7         1           arch_prctl
  0.00    0.000007           7         1           set_tid_address
  0.00    0.000007           7         1           set_robust_list
------ ----------- ----------- --------- --------- ----------------
100.00    3.377465                   148         9 total

2、查看进程某个读写的文件

#strace -e open,write PROG

3、查看某个已经在执行的进程调用

#strace -p PID PROG
最新回复 (0)
    • 运维开源项目互助社区—致敬开源
      2
        立即登录 立即注册 
返回