调试神器之strace
概述
strace是一个有用的诊断,调试工具。通过追踪程序,可以了解到一个系统和系统调用的很多事情。被跟踪中的每一行都包含系统调用名称,后跟括号中的参数及其返回值。每个系统调用的名称,参数及其返回值都打印在标准错误或用-o选项指定的文件上。
strace 常用参数说明
接下来我列出常用的几个参数并举例说明,
-c 计算每个系统调用的运行时间,调用和错误,并打出报告。
-p pid使用进程标识pid附加到进程并开始跟踪。
-e trace =signal
跟踪所有信号相关的系统调用。
-e trace = ipc
跟踪所有与IPC相关的系统调用。
-e trace = desc
跟踪所有与文件描述符相关的系统调用。
-e trace =memory
跟踪所有内存映射相关的系统调用。
-e abbrev = set
缩写打印大型结构的每个成员的输出。默认是abbrev = all。 -v选项具有abbrev = none的效果。
-e verbose = set
指定的一组系统调用的解引用结构。默认是verbose = all。
-e raw = set打印指定的一组系统调用的原始未解码参数。
-e signal=set
只跟踪指定的信号子集。缺省值是signal = all。例如,信号=! SIGIO(或signal =!io)会导致SIGIO信号不被跟踪。
例子一测试Nginx启动过程调用的系统接口
[root@bogon nginx]# strace -c ./sbin/nginx
nginx: [emerg] [ah_shm_zone] g_shm_dict_list push test is ok in /usr/local/nginx//conf/nginx.conf:27
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
29.93 0.000524 22 24 1 open
14.22 0.000249 6 44 mmap
9.94 0.000174 29 6 socket
9.02 0.000158 158 1 clone
8.85 0.000155 6 24 mprotect
4.23 0.000074 12 6 munmap
4.05 0.000071 3 25 close
3.88 0.000068 4 18 read
2.80 0.000049 12 4 4 connect
2.17 0.000038 2 20 fstat
1.83 0.000032 5 7 1 stat
1.43 0.000025 13 2 write
1.37 0.000024 2 14 rt_sigaction
1.31 0.000023 5 5 5 mkdir
0.69 0.000012 2 5 brk
0.63 0.000011 3 4 listen
0.51 0.000009 5 2 bind
0.46 0.000008 4 2 pread64
0.40 0.000007 4 2 2 access
0.34 0.000006 2 3 getrlimit
0.29 0.000005 3 2 ioctl
0.29 0.000005 3 2 setsockopt
0.29 0.000005 5 1 epoll_create
0.23 0.000004 2 2 uname
0.23 0.000004 2 2 fcntl
0.11 0.000002 2 1 lseek
0.11 0.000002 2 1 geteuid
0.11 0.000002 2 1 arch_prctl
0.11 0.000002 2 1 set_tid_address
0.11 0.000002 2 1 set_robust_list
0.06 0.000001 1 1 rt_sigprocmask
0.00 0.000000 0 1 execve
------ ----------- ----------- --------- --------- ----------------
100.00 0.001751 234 13 total
使用strace注意事项
1)如果程序有链接动态库,strace的追踪可能会混乱。
2)在某些情况下,系统调用将与已记录的行为有所不同或具有不同的名称。
3)strace 使用-p 参数时可能有些接口会收到EINTR中断。