strace命令使用分析
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了strace命令使用分析相关的知识,希望对你有一定的参考价值。
描述
在操作系统中,进程分为用户态进程和内核态进程,应用程序运行在用户态,内核态负责对资源包括网络,磁盘,内存等管理,用户态进程要访问这些资源时,需要通过系统调用陷入内核态,由内核来统一管理和分配。
通过系统调用陷入内核态,或者应用程序运行过程中,产生的signal,都可以被strace捕获到,每个系统调用的名称,参数,返回值,调用时间通过标准错误输出或者-O选项写入到文件中,通过分析这些信息,可以在应用程序发生故障时,不用重新编译程序,就可以捕获当前进程内部正在做什么。
常用参数
-c 统计每一系统调用的所执行的时间,次数和出错的次数等.
-d 输出strace关于标准错误的调试信息.
-f 除了跟踪当前进程外,还跟踪由fork调用所产生的子进程.
-ff 如果提供-o filename,则所有进程的跟踪结果输出到相应的filename.pid中,pid是各进程的进程号.
-F 尝试跟踪vfork调用.在-f时,vfork不被跟踪.
-h 输出简要的帮助信息.
-i 输出系统调用的入口指针寄存器值.
-q 禁止输出关于结合(attaching)、脱离(detaching)的消息,当输出重定向到一个文件时,自动抑制此类消息.
-r 打印出相对时间关于每一个系统调用,即连续的系统调用起点之间的时间差,与-t对应.
-t 打印各个系统调用被调用时的绝对时间秒级,观察程序各部分的执行时间可以用此选项。
-tt 在输出中的每一行前加上时间信息,微秒级.
-ttt 在每行输出前添加相对时间信息,格式为”自纪元时间起经历的秒数.微秒数”
-T 显示每一调用所耗的时间,其时间开销在输出行最右侧的尖括号内.
-v 冗余显示模式:显示系统调用中argv[]envp[]stat、termio(s)等数组/结构体参数所有的元素/成员内容.
-V 输出strace的版本信息.
-x 以十六进制形式输出非标准字符串 。
-xx 所有字符串以十六进制形式输出.
-a column 设置返回值的输出位置.默认为40,即"="出现在第40列.
-e expr 指定一个表达式,用来控制如何跟踪.
-e trace=set 只跟踪指定的系统 调用.例如:-e trace=open.
-e trace=file 只跟踪有关文件操作的系统调用.
-e trace=process 只跟踪有关进程控制的系统调用.
-e trace=network 跟踪与网络有关的所有系统调用.
-e trace=signal 跟踪所有与系统信号有关的 系统调用
-e trace=ipc 跟踪所有与进程通讯有关的系统调用
-e abbrev=set 设定 strace输出的系统调用的结果集.-v 等与 abbrev=none.默认为abbrev=all.
-e raw=set 将指 定的系统调用的参数以十六进制显示.
-e signal=set 指定跟踪的系统信号.默认为all.如signal=!SIGIO,表示不跟踪SIGIO信号.
-e read=set 输出从指定文件中读出 的数据.例如: -e read=3,5 -e write=set
-e read,write,open 查看打开读写文件
-E var 从命令的环境变量列表中移除var。
-E var=val 将var=val放入命令的环境变量列表.
-o filename 将strace的输出写入文件filename,而不是显示到标准错误输出(stderr).
-p pid 跟踪指定的进程pid,可指定多达32个(-p pid)选项以同时跟踪多个进程。该选项常用于调试后台进程.
-s strsize 限制每行输出中字符串(如read参数)的最大显示长度,默认32字节。但文件名总是完整显示
-S sortby 按指定规则对-c选项的输出直方图进行排序。sortby取值可为time、calls、name和nothing(默认 time)
-u username 以username 的UID和GID执行被跟踪的命令
-yy 查看文件等详细信息,用于查看,进行tcp/udp read/write时,查看socket的五元组详细信息(比如ip,port,tcp)。
重要参数
-i -f -e -tt -t -f -o -p -T -c
范例
1.查找读写文件
root@localhost:/src# strace -i -f -p 926 -tt -yy -T -e write,read,open
10:06:40.697117 [00007faad8351471] write(3</src/aaa.log>, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"..., 12288) = 12288 <0.000069>
10:06:41.298655 [00007faad8351471] write(3</src/aaa.log>, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"..., 12288) = 12288 <0.000068>
10:06:41.900236 [00007faad8351471] write(3</src/aaa.log>, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"..., 12288) = 12288 <0.000061>
10:06:42.501839 [00007faad8351471] write(3</src/aaa.log>, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"..., 12288) = 12288 <0.000070>
以上是关于strace命令使用分析的主要内容,如果未能解决你的问题,请参考以下文章