(5)重定向输出
[root@localhost tmp]# strace -c -o /tmp/test.txt /usr/local/nginx/sbin/nginx #-o选项将strace的结果输出到文件中 [root@localhost tmp]# cat test.txt % time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- -nan 0.000000 0 29 read -nan 0.000000 0 31 open -nan 0.000000 0 33 close -nan 0.000000 0 6 stat(6)对系统调用进行计时
[root@localhost tmp]# /usr/local/nginx/sbin/nginx -s stop [root@localhost tmp]# strace -T /usr/local/nginx/sbin/nginx #使用-T将每个系统调用所花费的时间打印出来,每个调用的时间花销在调用行最右边的尖括号里 execve("/usr/local/nginx/sbin/nginx", ["/usr/local/nginx/sbin/nginx"], [/* 24 vars */]) = 0 <0.000075> brk(0) = 0x1055000 <0.000003> mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbbf84f6000 <0.000004> access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) <0.000005> open("/etc/ld.so.cache", O_RDONLY) = 3 <0.000004> fstat(3, {st_mode=S_IFREG|0644, st_size=15441, ...}) = 0 <0.000003> mmap(NULL, 15441, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbbf84f2000 <0.000003> close(3) = 0 <0.000003> open("/lib64/libdl.so.2", O_RDONLY) = 3 <0.000005> read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\340\r\0\0\0\0\0\0"..., 832) = 832 <0.000003> fstat(3, {st_mode=S_IFREG|0755, st_size=19536, ...}) = 0 <0.000003> mmap(NULL, 2109696, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fbbf80d4000 <0.000004> mprotect(0x7fbbf80d6000, 2097152, PROT_NONE) = 0 <0.000004> ...... 1.7.3 小结strace命令很适合处理程序僵尸、命令执行报错等问题。如果从程序日志和系统日志中看不出问题出现的原因,则可以strace一下,也许会有答案,不过也需要使用者有足够的耐心去查看输出。
1.8 ltrace :跟踪进程调用库函数 1.8.1 命令解释功能说明:
ltrace能够跟踪进程的库函数调用,它会显现出调用了哪个库函数,而strace则是跟踪进程的每个系统调用
选项说明:
参数选项 解释说明(带@为重点)-c 统计库函数每次调用的时间,最后程序退出时打印摘要
-C 解码低级别名称(内核级)为用户级名称
-d 打印调试信息
-e expr 输出过滤器,通过表达式,可以过滤掉你不想要的输出@
-e printf 表示只查看printf函数调用
-f 跟踪子进程
-o filename 将ltrace的输出写入文件filename
-p pid 指定要跟踪的进程pid@
-r 输出每一个调用的相对时间
-S 显示系统调用
-t 在输出中每一行前加上时间信息。例如 16:45:28
-tt 在输出中每一行前加上时间信息。例如 11:18:59.759546
-ttt 在输出中每一行前加上时间信息,精确到微妙,而且时间表示为UNIX时间戳。
-T 显示每次调用所花费时间
-u username 以username的UID和GID执行所跟踪的命令
1.8.2 使用范例
(1)ltrace使用
ltrace的用法与strace非常相似,选项功能也是类似,下面简单看一下ltrace命令的执行结果
[root@localhost tmp]# ltrace /usr/local/nginx/sbin/nginx #ltrace后面直接接上要检测的命令语句 memcpy(0x1d5b7b0, "www.yunjisuan.com", 17) = 0x1d5b7b0 memcpy(0x1d5b7c1, "/usr/local/nginx/", 17) = 0x1d5b7c1 malloc(2048) = 0x1d55530 memset(0x1d55530, '\000', 68) = 0x1d55530 memset(0x1d55530, '\000', 70) = 0x1d55530 memset(0x1d55530, '\000', 72) = 0x1d55530 memset(0x1d55530, '\000', 74) = 0x1d55530 memset(0x1d55530, '\000', 76) = 0x1d55530 memset(0x1d55530, '\000', 78) = 0x1d55530 memset(0x1d55530, '\000', 80) = 0x1d55530 memset(0x1d55530, '\000', 82) = 0x1d55530 memset(0x1d55530, '\000', 84) = 0x1d55530 memset(0x1d55530, '\000', 86) = 0x1d55530 ...... sigemptyset(0x7fffb75519f8) = 0 sigaction(17, 0x7fffb75519f0, NULL) = 0 sigemptyset(0x7fffb75519f8) = 0 sigaction(31, 0x7fffb75519f0, NULL) = 0 sigemptyset(0x7fffb75519f8) = 0 sigaction(13, 0x7fffb75519f0, NULL) = 0 fork() = 3962 [pid 3961] exit(0 <unfinished ...> [pid 3961] +++ exited (status 0) +++