• strace 命令


    介绍

    strace常用来跟踪进程执行时的系统调用和所接收的信号。 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通 过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。

    参数

    -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执行被跟踪的命令 

    系统调用参数

    eg:
    fork        创建一个新进程  
    clone       按指定条件创建子进程  
    execve      运行可执行文件  
    exit        中止进程 
    nanosleep   使进程睡眠指定的时间 
    pause       挂起进程,等待信号 
    wait        等待子进程终止   
    waitpid     等待指定子进程终止  
    socket      建立socket  
    bind        绑定socket到端口  
    connect     连接远程主机  
    accept      响应socket连接请求  
    send        通过socket发送信息  
    recv        通过socket接收信息  
    mmap        映射虚拟内存页
    munmap      去除内存页映射  
    mremap      重新映射虚拟内存地址   
    msync       将映射内存中的数据写回磁盘   
    listen      监听socket端口  
    select      对多路同步I/O进行轮询  
    shutdown    关闭socket上的连接  
    readv       从文件读入数据到缓冲数组中  
    writev      将缓冲数组里的数据写入文件  
    pread       对文件随机读  
    pwrite      对文件随机写  
    lseek       移动文件指针    
    dup         复制已打开的文件描述字    
    flock       文件加/解锁   
    poll        I/O多路转换   
    truncate    截断文件 
    

      

     

    排查实例:  

    strace  -c -p $pid  查找占用时间较长的系统调用,或用-o指定文件存储

    如图观察read占用较多,可针对read来排查strace  -T -e read -p $pid

  • 相关阅读:
    QA的几个经典问题(1)
    QA的几个经典问题(2)
    通过Android录音进行简单音频分析
    Android在TextView中实现RichText风格
    Handler Should be static or leaks Occur?
    如何查看华为EMUI系统APK源码?
    ServiceManager: Permmission failure: android.permission.RECORD_AUDIO
    Android 4.4以上的存储读写权限
    如何使用Android中hide的类和方法进行开发?
    在Mac mini上编译Android源码
  • 原文地址:https://www.cnblogs.com/liuquan/p/9112509.html
Copyright © 2020-2023  润新知