[转帖]Linux命令之strace命令

linux,命令,strace · 浏览次数 : 0

小编点评

**一、命令简介** `strace` 是一个非常有用的诊断、指导和调试工具,可以帮助系统管理员、诊断专家和故障解决人员了解程序运行过程,并跟踪甚至普通程序的系统调用和信号。 **二、使用示例** **1、命令安装** ```bash yum install -y strace ``` **2、查看命令版本** ```bash strace -V strace – version 4.24 … ``` **3、获取命令帮助** ```bash strace -h usage: strace [-CdffhiqrtttTvVwxxy] [-I n] [-e expr]… ``` **4、跟踪ls命令** ```bash strace ls -h execve("ls", ["ls", "-h"]) = 0 ``` **5、使用语法及参数说明** * `-r`: 打印相对时间戳 * `-s`: 打印字符串长度限制为 STRSIZE字符(默认 32) * `-t`: 打印绝对时间戳 * `-tt`: 使用 usecs 打印绝对时间戳 * `-T`: 打印每个系统调用花费的时间 * `-x`: 以十六进制打印非ascii字符串 * `-xx`: 以十六进制打印所有字符串 * `-X`: 设置打印命名常量和标志的格式 * `-y`: 与套接字文件描述符关联的协议特定信息 * `-c`: 统计每个系统调用的时间、调用和错误,并报告摘要 * `-C`: 统计系统调用延迟(默认为系统时间) * `-p`: 启动参数,可以重复 * `-u`: 启动参数,处理 setuid 和/或 setgid 的用户名运行命令 * `-d`: 启用调试输出到 stderr-v详细模式 * `-h`: 打印帮助信息 * `-V`: 打印版本信息 * `-d`: 其他参数启用调试输出到 stderr-v 其他参数详细模式 **6、使用语法及参数说明的示例** ```bash strace -r -t -p 5859 -u root -d -h ``` **七、使用其他参数说明** * `-i`: 输出格式参数,在系统调用时打印指令指针 * `-k`: 输出格式参数,获取每个系统调用之间的堆栈跟踪 * `-o`: 输出格式参数,将跟踪输出发送到文件而不是 stderr * `-r`: 输出格式参数,打印相对时间戳 * `-s`: 输出格式参数,打印字符串长度限制为 STRSIZE 字符 * `-t`: 输出格式参数,打印绝对时间戳 * `-tt`: 输出格式参数,使用 usecs 打印绝对时间戳 * `-T`: 输出格式参数,打印每个系统调用花费的时间 * `-x`: 输出格式参数,以十六进制打印非ascii字符串 * `-xx`: 输出格式参数,以十六进制打印所有字符串 * `-X`: 设置打印命名常量和标志的格式 * `-y`: 与套接字文件描述符关联的协议特定信息 * `-c`: 统计每个系统调用的时间、调用和错误,并报告摘要 * `-C`: 统计系统调用延迟(默认为系统时间) * `-p`: 启动参数,可以重复 * `-u`: 启动参数,处理 setuid 和/或 setgid 的用户名运行命令 * `-d`: 启用调试输出到 stderr-v详细模式 * `-h`: 打印帮助信息 * `-V`: 打印版本信息

正文

一、命令简介

  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其他参数打印版本信息
文章知识点与官方知识档案匹配,可进一步学习相关知识
CS入门技能树Linux进阶新增用户26343 人正在系统学习中

与[转帖]Linux命令之strace命令相似的内容:

[转帖]Linux命令之strace命令

一、命令简介 strace是一个有用的诊断、指导和调试工具。系统管理员、诊断专家和故障解决人员将发现,对于解决源代码不易获得的程序的问题,这是非常宝贵的,因为它们不需要重新编译以跟踪它们。学生、黑客和过分好奇的人会发现,通过跟踪甚至是普通程序,可以了解到大量关于系统及其系统调用的信息。程序员会发现,

[转帖]Linux下strace调试系统应用参数总结(附实例操作讲解)

文章目录 一、简介二、常用参数详解三、实例详解3.1 跟踪具体进程3.2 监控具体程序执行过程 四、其他相关知识链接 一、简介 strace命令是一个集诊断、调试、统计与一体的Linux 用户空间跟踪器,我们可以使用strace对应用的系统调用、信号传递和进程状态变更的监控结果来对应用进行分析,以达

[转帖]Linux下strace调试系统应用参数总结(附实例操作讲解)

文章目录 一、简介二、常用参数详解三、实例详解3.1 跟踪具体进程3.2 监控具体程序执行过程 四、其他相关知识链接 一、简介 strace命令是一个集诊断、调试、统计与一体的Linux 用户空间跟踪器,我们可以使用strace对应用的系统调用、信号传递和进程状态变更的监控结果来对应用进行分析,以达

[转帖]Linux命令拾遗-动态追踪工具

原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。 简介# 这是Linux命令拾遗系列的第六篇,本篇主要介绍工作中常用的动态追踪工具strace、arthas、bpftrace等。 本系列文章索引Linux命令拾遗-入门篇Linux命令拾遗-文本处理篇Linux命令拾遗-

[转帖]Linux命令之getfacl和setfacl命令

一、命令简介 getfacl命令来自于英文词组”get file access control list“的缩写,其功能是用于显示文件或目录的ACL策略。对指定的文件或目录进行精准的权限控制,FACL是不二之选。对于每个文件,getfacl显示文件名、所有者、组和访问控制列表(ACL)。如果目录具有

[转帖]Linux命令之systemctl命令

一、systemctl命令简介 CentOS 5使用SysV init;CentOS 6使用Upstart,CentOS 7使用Systemd管理守护进程。centos7采用 systemd管理,服务独立的运行在内存中,服务响应速度快,但占用更多内存。独立服务的服务启动脚本都在目录 /usr/lib

[转帖]Linux命令之ulimit命令

一、命令简介 ulimit是一个计算机命令,用于shell启动进程所占用的资源,可用于修改系统资源限制。使用ulimit命令用于临时修改资源限制,如果需要永久修改需要将设置写入配置文件/etc/security/limits.conf。 二、使用示例 1、查看当前资源限制设置 [root@test1

[转帖]Linux命令之tr命令

一、命令介绍 tr 命令用于转换或删除文件中的字符。tr 指令从标准输入设备读取数据,执行转换(或者压缩、删除)处理,将结果输出到标准输出设备。 二、使用示例 0、示例文件 [root@test1 test]# cat 1.txt The string is used to describe the

[转帖]Linux网络命令之 `brctl`

文章目录 1 网桥的概念2 管理网桥的命令3 举例 1 网桥的概念 摘自百度百科: 网桥(Bridge)是早期的两端口二层网络设备,用来连接不同网段。 网桥是一种对帧进行转发的技术,根据 MAC 分区块,可隔离碰撞。网桥将网络的多个网段在数据链路层连接起来。 网桥也叫桥接器,是连接两个局域网的一种存

[转帖]linux之iftop命令

https://rumenz.com/rumenbiji/linux-iftop.html Linux安装iftop > yum install iftop -y > iftop 界面如下 界面参数说明 =>代表发送数据 <=代表接收数据 TX:发送流量 RX:接收流量 TOTAL:总流量 Cumm