参考文献

strace

  • strace命令用于跟踪系统调用和信号.主要用于诊断,调试程序,使用该命令能够打印出进程执行的系统调用信息.

  • strace常用选项如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    strace -fT -tt -yy [-p 进程号]
    -f 跟踪子进程
    -T 系统调用执行耗时,行尾展示
    -tt 开始执行时间,精度ms,行首展示
    -r 打印相对耗时
    -yy 打印fd信息,对于文件会打印/文件名,对于socket会打印四元组
    -o 打印记录到文件
    -ff 搭配-o时使用,同时记录子进程跟踪结果


    root@holelin:~# ps -ef |grep sshd
    root 794 1 0 04:21 ? 00:00:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
    root 1954 794 1 07:32 ? 00:00:01 sshd: root@pts/1
    root 2106 794 0 07:33 ? 00:00:00 sshd: root@pts/0
    root 2199 2082 0 07:34 pts/1 00:00:00 grep --color=auto sshd
    root@holelin:~# strace -fT -tt -yy -p 794
    strace: Process 794 attached
    07:34:05.977817 pselect6(7, [3<TCP:[0.0.0.0:22]> 4<TCPv6:[[::]:22]>], NULL, NULL, NULL, NULL

示例

找出应用程序启动时读取的配置文件

1
2
3
4
5
strace mysql 2>&1 |grep my.cnf
stat("/etc/my.cnf", 0x7ffc3bd0d7e0) = -1 ENOENT (No such file or directory)
stat("/etc/mysql/my.cnf", {st_mode=S_IFREG|0644, st_size=869, ...}) = 0
openat(AT_FDCWD, "/etc/mysql/my.cnf", O_RDONLY|O_CLOEXEC) = 3
stat("/home/xx/.my.cnf", 0x7ffc3bd0d7e0) = -1 ENOENT (No such file or directory)

查找为什么程序没有打开指定文件

1
$ strace -e open,access 2>&1 |grep your-filename
  • -e参数指定了一个限定表达式用于指定要跟踪的事件和如何跟踪它们.

    1
    [qualifier=][!]value1[,value2]...
    • 这里的qualifier可选值为: trace, abbrev, verbose, raw, signal, read, write.默认的qualifiertrace.

查看进程的哪些操作比较耗时

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
strace -c >/dev/null ls
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
0.00 0.000000 0 7 read
0.00 0.000000 0 1 write
0.00 0.000000 0 12 close
0.00 0.000000 0 11 fstat
0.00 0.000000 0 18 mmap
0.00 0.000000 0 12 mprotect
0.00 0.000000 0 2 munmap
0.00 0.000000 0 3 brk
0.00 0.000000 0 2 rt_sigaction
0.00 0.000000 0 1 rt_sigprocmask
0.00 0.000000 0 3 3 ioctl
0.00 0.000000 0 8 7 access
0.00 0.000000 0 1 execve
0.00 0.000000 0 2 getdents
0.00 0.000000 0 2 2 statfs
0.00 0.000000 0 1 arch_prctl
0.00 0.000000 0 1 set_tid_address
0.00 0.000000 0 10 openat
0.00 0.000000 0 1 set_robust_list
0.00 0.000000 0 1 prlimit64
------ ----------- ----------- --------- --------- ----------------
100.00 0.000000 99 12 total