Linux(程序设计):39---strace系统调用检测工具

一、什么是监视调试

  • 有时,通过监视用户空间中应用程序的运行情况,可以捕捉到一些小问题。监视程序同时也有助于确认驱动程序工作是否正常
  • 例如,查看scull的read实现如何响应不同数据量的read请求,就可以判断它是否工作正常
  • 有许多方法可用来监视用户空间程序的工作情况,比如使用调试器,或者在strace状态下运行程序等。在检查内核代码时,strace技术最值得关注

二、strace工具介绍

  • 功能:
    • strace命令是一个功能非常强大的工具,它可以显示由用户空间程序所发出的所有系统调用
    • 它不仅可以显示调用。而且还能显示调用参数以及用符号形式表示的返回值。当系统调用失败时,错误的符号值(如ENOMEM)和对应的字符串(如“Out of memory”)都能被显示出来
    • strace将跟踪信息打印到stderr
    • gdb等调试器可以连接到一个正在运行的进程并控制该进程,strace也可以跟踪一个正在运行的进程
  • 格式如下:
strace [-CdffhikqrtttTvVxxy] [-I n] [-b execve] [-e expr]... 
[-a column] [-o file] [-s strsize] [-P path]... [-p pid]... 
{ -p pid | [-D] [-E var[=val]]... [-u username] command [args] }

strace -c [-df] [-I n] [-b execve] [-e expr]... [-O overhead]
 [-S sortby] [-P path]... [-p pid]... { -p pid | [-D] 
[-E var[=val]]... [-u username] command [args] }
  • 参数:
    • -c:统计每一系统调用的所执行的时间,次数和出错的次数等.
    • -d:输出strace关于标准错误的调试信息.
    • -f:跟踪由fork调用所产生的子进程.
    • -ff:如果提供-o filename,则所有进程的跟踪结果输出到相应的filename.pid中,pid是各进程的进程号.
    • -F:尝试跟踪vfork调用.在-f时,vfork不被跟踪.
    • -h:输出简要的帮助信息.
    • -i:输出系统调用的入口指针.
    • -q:禁止输出关于脱离的消息.
    • -r:打印出相对时间关于,,每一个系统调用.
    • -t:在输出中的每一行前加上时间信息.
    • -tt:在输出中的每一行前加上时间信息,微秒级.
    • -ttt:微秒级输出,以秒了表示时间.
    • -T:显示每一调用所耗的时间.
    • -v:输出所有的系统调用.一些调用关于环境变量,状态,输入输出等调用由于使用频繁,默认不输出.
    • -V:输出strace的版本信息.
    • -x:以十六进制形式输出非标准字符串
    • -xx:所有字符串以十六进制形式输出.
    • -a column:设置返回值的输出位置.默认 为40.
    • -e expr:指定一个表达式,用来控制如何跟踪
      • 格式如下:[qualifier=][!]value1[,value2]...qualifier只能是 trace,abbrev,verbose,raw,signal,read,write其中之一.value是用来限定的符号或数字.默认的 qualifier是 trace.感叹号是否定符号.
      • 例如:-eopen等价于 -e trace=open,表示只跟踪open调用.而-etrace!=open表示跟踪除了open以外的其他调用.有两个特殊的符号 all 和 none.
      • 注意有些shell使用!来执行历史记录里的命令,所以要使用\\.
    • -e trace=set:只跟踪指定的系统 调用.例如:-e trace=open,close,rean,write表示只跟踪这四个系统调用.默认的为set=all.
    • -e trace=file:只跟踪有关文件操作的系统调用.
    • -e trace=process:只跟踪有关进程控制的系统调用.
    • -e trace=network:跟踪与网络有关的所有系统调用.
    • -e strace=signal:跟踪所有与系统信号有关的 系统调用
    • -e trace=ipc:跟踪所有与进程通讯有关的系统调用
    • -e abbrev=set:设定 strace输出的系统调用的结果集.-v 等与 abbrev=none.默认为abbrev=all.
    • -e raw=set:将指 定的系统调用的参数以十六进制显示.
    • -e signal=set:指定跟踪的系统信号.默认为all.如 signal=!SIGIO(或者signal=!io),表示不跟踪SIGIO信号.
    • -e read=set:输出从指定文件中读出 的数据.例如:
    • -e read=3,5:
    • -e write=set:输出写入到指定文件中的数据.
    • -o filename:将strace的输出写入文件filename
    • -p pid:跟踪指定的进程pid.
    • -s strsize:指定输出的字符串的最大长度.默认为32.文件名一直全部输出.
    • -u username:以username 的UID和GID执行被跟踪的命令
  • 总结:
    • 我们可以在strace的输出中发现很多有用信息,但如果觉得这些符号过于拖累的话,则可以仅限于监视文件方法(read、write等)的工作成功
    • strace对于查找系统调用运行时的细微错误最为有用,例如确切查明系统调用的哪个参数引发了错误

三、演示案例

  • 下面我们启动一个Nginx进程

  • 输入下面的命令监控Nginx工作进程,然后按下ctrl+c终止strace程序并打印信息
sudo strace -c -p 28657

Linux(程序设计):39---strace系统调用检测工具_第1张图片

 

你可能感兴趣的:(Linux(程序设计))