Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5783202
  • 博文数量: 291
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 7924
  • 用 户 组: 普通用户
  • 注册时间: 2016-07-06 14:28
个人简介

阿里巴巴是个快乐的青年

文章分类

全部博文(291)

文章存档

2018年(21)

2017年(4)

2016年(5)

2015年(17)

2014年(68)

2013年(174)

2012年(2)

分类: LINUX

2013-07-22 10:54:39

        strace是Linux环境下的一款程序调试工具,用于跟踪进程执行时的系统调用和所接收的信号,包括参数、返回值、执行时间。在Linux中,应用程序访问系统设备,必须由用户态切换到内核态,这一过程是通过系统调用发起并完成的。
一、常用参数
        -c:统计每种系统调用执行的时间、调用次数、出错次数,程序退出时给出报告
        -p pid:跟踪指定的进程,可以使用多个-p同时跟踪多个进程
        -o filename:starce默认将结果输出到标准输出即stdout,-o可以将结果输出到指定的文件中
        -f:跟踪由fork产生的子进程的系统调用
        -ff:常与-o选项一起使用,不同进程(子进程)产生的系统调用结果输出到各个filename.pid文件中
        -F:尝试跟踪vfork子进程系统调用,需要注意的是,如果与-f选项同时使用时,vfork不被跟踪
        -e expr:输出过滤表达式,可以过滤掉不想输出的strace结果
        -e trace=set:指定跟踪set中的系统调用
        -e trace=network:跟踪与网络有关的所有系统调用
        -e strace=signal:跟踪与系统信号有关的所有系统调用
        -e trace=ipc:跟踪与进程通讯有关的所有系统调用
        -e signal=set:指定跟踪set中的信号
        -e read=set:输出从指定文件中读出的数据,比如-e read=3,5
        -e write=set:输出写入到指定文件中的数据,比如-e write=1
        -r:打印每一个系统调用的相对时间
        -T 显示每一调用所耗的时间
        -t:在输出中的每一行前加上时间信息,时间精确到秒级
        -tt:在输出中的每一行前加上时间信息,时间精确到微秒级
        -ttt:在输出中的每一行前加上时间信息,输出为相对时间
        -s:指定每一行输出字符串的长度(默认是32)
        -x以十六进制形式输出非标准字符串 
        -xx所有字符串以十六进制形式输出

二、应用举例
        strace -t pwd:跟踪pwd,每行输出结果前打印出执行时间
        strace -r pwd:跟踪pwd,每行输出结果前打印出相对时间
        strace -p pid1 -p pid2:同时跟踪进程pid1、pid2
        strace -f -e trace=read,write -p pid1 -o log:跟踪进程pid1及子进程中的read和write系统调用,并将结果输出到log文件
        strace -c pwd:统计pwd执行时,每种系统调用执行的时间、调用菜蔬、出错次数等
        如果在centos下,直接strace pwd能得到如下结果:
        # strace pwd
        execve("/bin/pwd", ["pwd"], [/* 26 vars */]) = 0
        brk(0)                                  = 0x143e000
        mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f51d9917000
        access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
        open("/etc/ld.so.cache", O_RDONLY)      = 3    
        fstat(3, {st_mode=S_IFREG|0644, st_size=54754, ...}) = 0
        mmap(NULL, 54754, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f51d9909000
        close(3)                                = 0
        open("/lib64/libc.so.6", O_RDONLY)      = 3
        read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\360\355A@2\0\0\0"..., 832) = 832
        fstat(3, {st_mode=S_IFREG|0755, st_size=1922152, ...}) = 0
        mmap(0x3240400000, 3745960, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x3240400000
        mprotect(0x324058a000, 2093056, PROT_NONE) = 0
        mmap(0x3240789000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x189000) = 0x3240789000
        mmap(0x324078e000, 18600, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x324078e000
        close(3)                                = 0
        mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f51d9908000
        mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f51d9907000
        mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f51d9906000
        arch_prctl(ARCH_SET_FS, 0x7f51d9907700) = 0
        mprotect(0x3240789000, 16384, PROT_READ) = 0
        mprotect(0x324021f000, 4096, PROT_READ) = 0
        munmap(0x7f51d9909000, 54754)           = 0
        brk(0)                                  = 0x143e000
        brk(0x145f000)                          = 0x145f000
        open("/usr/lib/locale/locale-archive", O_RDONLY) = 3
        fstat(3, {st_mode=S_IFREG|0644, st_size=99158576, ...}) = 0    
        mmap(NULL, 99158576, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f51d3a75000
        close(3)                                = 0
        getcwd("/mnt/hgfs/OGPkpkService", 4096) = 24
        fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 3), ...}) = 0
        mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f51d9916000
        write(1, "/mnt/hgfs/OGPkpkService\n", 24/mnt/hgfs/OGPkpkService
        ) = 24
        close(1)                                = 0
        munmap(0x7f51d9916000, 4096)            = 0
        close(2)                                = 0
        exit_group(0)                           = ?
        不为人知的秘密真多啊
        strace记录了程序所发出的每一次系统调用,并且各自显示在单独的一行中。系统调用的名字出现在每一行的起始,参数出现在括号里面,返回值则在等号后面,是一行的终结。
        #strace -s 10000 -o output.log -f xxx
        #strace -s 10000 -o output.log -f -p xxx
        常用如上两种方式:每行输出字符串长度为10000,输出文件为output.log,跟踪fork产生的子进程,跟踪xxx程序或者进程ID。
        #strace -f -o output.log /usr/local/bin/xxxServer -c /usr/local/conf/xxxServer.conf start
        用strace启动后台服务,并输出到output.log。
        #sudo strace -c -o ~/static_output_51449.log -f -p 51449
        #sudo strace -s 10000 -Ttt -o ~/output_51449.log -f -p 51449
        #pstack 51449 > ~/stack_output_51449.log

        更多实例如下:
        1.利用pstack 和 strace分析程序在哪里耗时?
        2.利用strace/pstack调试Nginx
        3.谁偷走了你的服务器性能——Strace & Ltrace篇
        4.Linux上分析死锁的简单方法--gdb+pstack

        5.

阅读(4994) | 评论(3) | 转发(2) |
1

上一篇:Linux之gdb

下一篇:Linux之pmap

给主人留下些什么吧!~~

scq2099yt2013-07-22 15:03:02

Bean_lee:上班也能发博客?

昨天晚上写好了,保存为草稿的博客,顺手发一下

回复 | 举报

Bean_lee2013-07-22 12:41:44

上班也能发博客?

scq2099yt2013-07-22 10:55:08

文明上网,理性发言...