strace是Linux环境下的一款程序调试工具,用于检查一个应用程序所使用的系统调用以及它所接收的系统信息。strace会追踪程序运行时的整个生命周期,输出每一个系统调用的名字、参数、返回值和执行所消耗的时间等,是高级运维和开发人员排查问题的杀手锏。
选项说明
参数选项 解释说明(带@为重点)-c 统计每一个系统调用所执行的算时间、次数和出错的次数等
-d 输出strace关于标准错误的调试信息
-f 跟踪目标进程,以及目标进程创建的所有子进程@
-ff 如果提供-o filename,则将所有进程的跟踪结果输出到相应的filename.pid中,pid是各进程的进程号
-i 输出系统调用的入口指针
-q 禁止输出关于脱离的消息
-r 输出每一个系统调用的相对时间
-t 在输出中的每一行前加上时间信息。例如:16:45:28
-tt 在输出中的每一行前加上时间信息,精确到微秒。例如11:18:59.759546@
-ttt 在输出中的每一行前加上时间信息,精确到微秒,而且时间表示为UNIX时间戳。例如1486111461.650434
-T 显示每次系统调用所花费的时间
-v 对于某些相关调用,把完整的环境变量、文件stat结构等打印出来
-x 以十六进制形式输出非标准字符串
-xx 所有字符串以十六进制形式输出
-o filename 将strace的输出写入文件filename
-p pid 指定要跟踪的进程pid,要同时跟踪多个pid,重复多次-p选项即可@
-s strsize 指定输出的字符串的最大长度,默认为32.并没有将文件名视为字符串,默认全部输出
-u username 以username的UID和GID执行所跟踪的命令
输出过滤器
参数选项 解释说明(带@为重点)-e expr 输出过滤器,通过表达式,可以过滤掉你不想要的输出@
-e trace=open 表示只跟踪open调用而-e trace!=open表示跟踪除open外所有
-e trace=file 只跟踪与文件操作有关的系统调用
-e trace=process 只跟踪与进程有关的系统调用
-e trace=network 只跟踪与网络有关的系统调用
-e trace=signal 只跟踪与系统信号有关的系统调用
-e trace=desc 只跟踪与文件描述符有关的系统调用
-e trace=ipc 只跟踪与进程通信有关的系统调用
1.7.2 使用范例
(1)排查Nginx 403 forbidden错误
[root@localhost tmp]# strace -tt -f -o /tmp/test.txt /usr/local/nginx/sbin/nginx #f参数跟踪目标进程,以及目标进程创建的所有子进程,-tt参数在输出中的每一行前加上时间信息,-o将跟踪内容输出到文件里。 [root@localhost tmp]# cat test.txt 3824 05:37:14.300486 prctl(PR_SET_DUMPABLE, 1) = 0 3824 05:37:14.300498 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 3824 05:37:14.300518 epoll_create(512) = 8 3824 05:37:14.300535 eventfd2(0, 0) = 9 3824 05:37:14.300549 epoll_ctl(8, EPOLL_CTL_ADD, 9, {EPOLLIN|EPOLLET, {u32=7095968, u64=7095968}}) = 0 3824 05:37:14.300569 mmap(NULL, 233472, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f73714f7000 3824 05:37:14.300607 brk(0x1fa5000) = 0x1fa5000 3824 05:37:14.300693 epoll_ctl(8, EPOLL_CTL_ADD, 6, {EPOLLIN|0x2000, {u32=1901031440, u64=140133798998032}}) = 0 3824 05:37:14.300712 close(3) = 0 3824 05:37:14.300724 epoll_ctl(8, EPOLL_CTL_ADD, 7, {EPOLLIN|0x2000, {u32=1901031664, u64=140133798998256}}) = 0 3824 05:37:14.300742 epoll_wait(8, #epoll_wait表示等待连接访问,因此后面的输出都是和前一次访问有关的,下面我们仔细看一下日志输出。