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

    技术2025-01-10  15

    一、什么是监视调试

    有时,通过监视用户空间中应用程序的运行情况,可以捕捉到一些小问题。监视程序同时也有助于确认驱动程序工作是否正常例如,查看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

     

    Processed: 0.010, SQL: 9