参考文献

strace

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

示例

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

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