zdq0394.github.com

Tech study and research.

Follow me on GitHub

strace

介绍

strace是个功能强大的Linux调试分析诊断工具,可用于跟踪程序执行时进程系统调用(system call)所接受的信号(signal)

在Linux系统中,用户程序运行在一个沙箱中,用户进程不能直接访问计算机硬件设备。当进程要访问硬件设备(如读取磁盘文件或接收网络数据等)时,必须由用户态模式切换至内核态模式,通过系统调用访问硬件设备。strace可以跟踪进程产生的系统调用,包括参数、返回值和执行所消耗的时间。若strace没有任何输出,并不代表此时进程发生阻塞;也可能程序进程正在执行某些不需要与系统其它部分发生通信的事情。

strace从内核接收消息,且无需以任何特殊方式来构建内核。

使用方法

  • -c:统计和报告每个系统调用所执行的时间、调用次数和出错次数等
  • -d:输出strace关于标准错误的调试信息
  • -f:跟踪当前进程及其fork系统调用所创建的子进程
  • -ff:常与-o选项联合使用,不同进程(子进程)的跟踪结果分别输出到相应的filename.pid文件中,pid是各个进程号
  • -F:尝试跟踪vfork系统调用。否则即使打开-f选项,vfork也不会被跟踪
  • -i:显示发生系统调用时指令(IP)寄存器的值
  • -r: 显示每个系统调用发生时的相对时间戳,即连续的系统调用起点之间的时间差
  • -t:每行输出前添加绝对时间戳(当前时钟)信息,精确到秒级
  • -tt:每行输出前添加绝对时间戳信息,精确到微秒级
  • -ttt:每行输出前添加相对时间信息,格式为“自纪元时间起经历的秒数.微秒数”
  • T:显示每个系统调用所耗费的时间,其时间开销在输出行最右侧的尖括号内
  • v:冗余显示模式:显示系统调用中argv[]、envp[]、stat、termio(s)等数组/结构体参数所有的元素/成员内容。这些数组/结构体因使用频繁,默认仅显示其元素/成员的合理子集
  • -x:以16进制形式显示非标准(non-ascii)字符串,如”/x08”。默认为8进制,如”/10”
  • -xx:以16进制形式显示所有字符串
  • -o file:strace输出信息默认显示到标准错误输出,该选项将输出信息写入文件file中
  • -p PID:指定待跟踪的进程号(pid),可用Ctrl-C终止跟踪而被跟踪进程继续运行。可指定多达32个(-p pid)选项以同时跟踪多个进程。该选项常用于调试后台进程
  • -s STRSIZE:限制每行输出中字符串(如read参数)的最大显示长度,默认32字节。但文件名总是完整显示。

使用示例

例子1

执行一个dd命令,耗时5.19286秒

dd if=/dev/zero of=/dev/null bs=1k count=5000k
5120000+0 records in
5120000+0 records out
5242880000 bytes (5.2 GB) copied, 5.19286 s, 1.0 GB/s

然后再次执行,并对命令进行strace剖析,命令共执行184.915,并且dd写入速度降低到28.4M/s。

这也说明,strace本身对应用程序(dd)是有影响的。

strace -c dd if=/dev/zero of=/dev/null bs=1k count=5000k
5120000+0 records in
5120000+0 records out
5242880000 bytes (5.2 GB) copied, 184.915 s, 28.4 MB/s
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 52.03   12.676807           2   5120003           read
 47.97   11.685592           2   5120003           write
  0.00    0.000059           5        12         6 open
  0.00    0.000016           2         9           close
  0.00    0.000012           6         2           munmap
  0.00    0.000007           1         9           mmap
  0.00    0.000003           1         4           fstat
  0.00    0.000000           0         1           lseek
  0.00    0.000000           0         4           mprotect
  0.00    0.000000           0         4           brk
  0.00    0.000000           0         4           rt_sigaction
  0.00    0.000000           0         1         1 access
  0.00    0.000000           0         2           dup2
  0.00    0.000000           0         1           execve
  0.00    0.000000           0         1           arch_prctl
------ ----------- ----------- --------- --------- ----------------
100.00   24.362496              10240060         7 total