Linux就业技术指导(五):Linux运维核心管理命令详解 (7)

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表示等待连接访问,因此后面的输出都是和前一次访问有关的,下面我们仔细看一下日志输出。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zygwxj.html