• Linux命令之strace命令


    一、命令简介

      strace是一个有用的诊断、指导和调试工具。系统管理员、诊断专家和故障解决人员将发现,对于解决源代码不易获得的程序的问题,这是非常宝贵的,因为它们不需要重新编译以跟踪它们。学生、黑客和过分好奇的人会发现,通过跟踪甚至是普通程序,可以了解到大量关于系统及其系统调用的信息。程序员会发现,由于系统调用和信号是发生在用户/内核界面上的事件,因此仔细检查该边界对于错误隔离、健全性检查和尝试捕获竞争条件非常有用。strace运行时它拦截并记录进程调用的系统调用和进程接收的信号。每个系统调用的名称、参数及其返回值都打印在标准错误上或打印到使用-o选项指定的文件中。

    二、使用示例

    1、命令安装

    [root@s142 ~]# yum install -y strace

    2、查看命令版本

    [root@s142 ~]# strace -V
    strace – version 4.24

    3、获取命令帮助

    [root@s142 ~]# strace -h
    usage: strace [-CdffhiqrtttTvVwxxy] [-I n] [-e expr]…

    4、strace跟踪ls -h命令

      直接在命令前面加上strace命令就可以跟踪命令的执行过程了,会详细的显示命令过程中执行的命令、系统调用、进程接收的信号等。
    在这里插入图片描述

    [root@s142 ~]# strace ls -h
    execve(“/usr/bin/ls”, [“ls”, “-h”], 0x7ffcb2bef228 /* 25 vars */) = 0
    brk(NULL)

    5、strace命令跟踪统计结果简洁显示

      使用-c参数可以显示strace命令的统计结果,显示命令执行了哪些系统调用信号、耗时、各系统调用次数等。
    在这里插入图片描述

    [root@s142 ~]# strace -c ls -h
    anaconda-ks.cfg
    % time seconds usecs/call calls errors syscall

    6、查看open调用类型

      strace默认查看所有调用信号,使用-e参数可以查看指定类型的调用,减少输出信息。支持的信号包括:trace, abbrev, verbose, raw, signal, read, write, fault, inject, kvm等。

    [root@s142 ~]# strace -e open ls -h
    open(“/etc/ld.so.cache”, O_RDONLY|O_CLOEXEC) = 3
    open(“/lib64/libselinux.so.1”, O_RDONLY|O_CLOEXEC) = 3
    open(“/lib64/libcap.so.2”, O_RDONLY|O_CLOEXEC) = 3
    open(“/lib64/libacl.so.1”, O_RDONLY|O_CLOEXEC) = 3
    open(“/lib64/libc.so.6”, O_RDONLY|O_CLOEXEC) = 3
    open(“/lib64/libpcre.so.1”, O_RDONLY|O_CLOEXEC) = 3
    open(“/lib64/libdl.so.2”, O_RDONLY|O_CLOEXEC) = 3
    open(“/lib64/libattr.so.1”, O_RDONLY|O_CLOEXEC) = 3
    open(“/lib64/libpthread.so.0”, O_RDONLY|O_CLOEXEC) = 3
    open(“/usr/lib/locale/locale-archive”, O_RDONLY|O_CLOEXEC) = 3
    anaconda-ks.cfg
    +++ exited with 0 +++

    7、显示时间戳

      strace输出默认是没有时间信息的,使用-t或者-tt参数我们可以打印命令执行的时间,精确到毫秒。
    在这里插入图片描述

    [root@s142 ~]# strace -t -e open ls -h
    03:23:18 open(“/etc/ld.so.cache”, O_RDONLY|O_CLOEXEC) = 3
    03:23:18 open(“/lib64/libselinux.so.1”, O_RDONLY|O_CLOEXEC) = 3

    8、将strace结果输出到指定文件

      如果希望保存strace命令执行的结果,我们可以使用-o参数将内容输出到指定文件。
    在这里插入图片描述

    [root@s142 ~]# strace -t -o /tmp/strace-ls.log ls -h
    anaconda-ks.cfg
    [root@s142 ~]# cat /tmp/strace-ls.log
    03:25:02 execve(“/usr/bin/ls”, [“ls”, “-h”], 0x7fff28de1af0 /* 25 vars */) = 0

    9、跟踪正在运行的进程

      如果是排查已经正在运行的进程的问题,我们可以使用-p参数跟踪指定进程的系统信号调用。
    在这里插入图片描述

    [root@s142 ~]# sh test.sh &
    [1] 5859
    [root@s142 ~]# 开始测试

    [root@s142 ~]# strace -t -e trace=process -f -p 5859
    strace: Process 5859 attached
    03:38:58 wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 5860

    三、使用语法及参数说明

    1、使用语法

    用法:strace [参数] 命令 [命令参数]

    2、参数说明

    参数参数类型参数说明
    -a column输出格式参数用于打印系统调用结果的对齐列(默认为40)
    -i输出格式参数在系统调用时打印指令指针
    -k输出格式参数获取每个系统调用之间的堆栈跟踪
    -o file输出格式参数将跟踪输出发送到文件而不是stderr
    -q输出格式参数抑制有关附加、分离等的消息。
    -r输出格式参数打印相对时间戳
    -s strsize输出格式参数将打印字符串的长度限制为STRSIZE字符(默认为32)
    -t输出格式参数打印绝对时间戳
    -tt输出格式参数使用usecs打印绝对时间戳
    -T输出格式参数打印每个系统调用花费的时间
    -x输出格式参数以十六进制打印非ascii字符串
    -xx输出格式参数以十六进制打印所有字符串
    -X format输出格式参数设置打印命名常量和标志的格式
    -y输出格式参数与文件描述符参数关联的打印路径
    -yy输出格式参数打印与套接字文件描述符关联的协议特定信息
    -c统计参数统计每个系统调用的时间、调用和错误,并报告摘要
    -C统计参数像-c一样,也可以打印常规输出
    -O overhead统计参数将跟踪系统调用的开销设置为开销usecs
    -S sortby统计参数按以下方式对系统调用计数排序:时间、调用、名称、无(默认时间)
    -w统计参数统计系统调用延迟(默认为系统时间)
    -e expr过滤参数限定表达式,表达式值可以是trace, abbrev, verbose, raw, signal, read, write, fault, inject, kvm
    -P path过滤参数跟踪访问路径
    -b execve跟踪参数执行系统调用时分离
    -D跟踪参数将跟踪进程作为分离的子进程运行,而不是作为父进程运行
    -f跟踪参数跟着叉子走
    -ff跟踪参数跟随分叉,输出到单独的文件中
    -I interruptible跟踪参数可中断信号
    1: 没有信号被阻塞
    2: 解码系统调用时阻止致命信号(默认)
    3: 致命信号始终被阻止(默认情况下为“-o FILE PROG”)
    4: 致命信号和SIGTSTP(^Z)始终被阻止
    -E var启动参数从命令的环境中删除var
    -E var=val启动参数将var=val放在命令的环境中
    -p pid启动参数id为pid的pid跟踪进程,可以重复
    -u username启动参数处理setuid和/或setgid的用户名运行命令
    -d启用调试输出到stderr
    -v详细模式:打印未修改的argv、stat、termios等参数
    -h打印帮助信息
    -V打印版本信息
    -d其他参数启用调试输出到stderr
    -v其他参数详细模式:打印未修改的argv、stat、termios等参数
    -h其他参数打印帮助信息
    -V其他参数打印版本信息
  • 相关阅读:
    【LeetCode每日一题:1774. 最接近目标价格的甜点成本~~~递归+深度优先遍历】
    输出分离与输出抽象
    神经网络系列---分类度量
    设计模式——访问者模式
    如何让页面跳转更丝滑
    git 推送出现fatal: The remote end hung up unexpectedly解决方案
    java毕业设计房产置购门户网站Mybatis+系统+数据库+调试部署
    redux使用,相当于vue中的vuex
    真假难辨!AI人像生成再进化!HyperHuman:基于隐式结构扩散的超逼真人像生成...
    笔记本触摸板没反应?实用技巧助你成功修复!
  • 原文地址:https://blog.csdn.net/carefree2005/article/details/126529232