strace 简介和使用

news2024/11/16 2:30:41

简介

strace是个功能强大的Linux调试分析诊断工具,可用于跟踪程序执行时进程系统调用(system call)和所接收的信号,尤其是针对源码不可读或源码无法再编译的程序。

在Linux系统中,用户程序运行在一个沙箱(sandbox)里,用户进程不能直接访问计算机硬件设备。当进程需要访问硬件设备(如读取磁盘文件或接收网络数据等)时,必须由用户态模式切换至内核态模式,通过系统调用访问硬件设备。strace可跟踪进程产生的系统调用,包括参数、返回值和执行所消耗的时间。若strace没有任何输出,并不代表此时进程发生阻塞;也可能程序进程正在自己的沙箱里执行某些不需要与系统其它部分发生通信的事情。strace从内核接收信息,且无需以任何特殊方式来构建内核。

命令格式

strace命令格式如下:

strace [-dffhiqrtttTvVxx] [-a column] [-e expr] [-o file] [-p pid] [-s strsize] [-u username] [-E var=val] [command [arg ...]]
#或者
strace -c [-e expr] [-O overhead] [-S sortby] [-E var=val] [command [arg ...]]

通过不同的选项开关,strace提供非常丰富的跟踪功能。最简单的应用是,跟踪可执行程序运行时的整个生命周期,将所调用的系统调用的名称、参数和返回值输出到标准错误输出stderr(即屏幕)或-o选项所指定的文件。注意,命令(command)必须位于选项列表之后。

详细的strace命令选项列举如下表:

选项含义
-c统计和报告每个系统调用所执行的时间、调用次数和出错次数等
-d输出strace关于标准错误的调试信息
-f跟踪当前进程及其通过fork系统调用所创建的子进程
-ff常与-o选项联合使用,不同进程(子进程)的跟踪结果分别输出到相应的filename. pid文件中,pid是各个进程号
-F尝试跟踪vfork系统调用。否则即使打开-f选项,vfork也不会被跟踪
-h显示帮助信息
-i显示发生系统调用时的指令指针(IP)寄存器值
-q抑制(禁止输出)关于结合(attaching)、脱离(detaching)的消息。当输出重定向到一个文件时,自动抑制此类消息
-r显示每个系统调用发生时的相对时间戳,即连续的系统调用起点之间的时间差
-t在每行输出前添加绝对时间戳(当前时钟)信息,精确到秒级
-tt在每行输出前添加绝对时间戳信息,精确到微秒级
-ttt在每行输出前添加相对时间信息,格式为”自纪元时间起经历的秒数.微秒数”
-T显示每个系统调用所耗费的时间,其时间开销在输出行最右侧的尖括号内
-V显示strace的版本信息
-v冗余显示模式:显示系统调用中argv[]、envp[]、stat、termio(s)等数组/结构体参数所有的元素/成员内容。这些数组/结构体因使用频繁,默认仅显示其元素/成员的合理子集
-x以16进制形式显示非标准(non-ascii)字符串,如"/x08"。默认为8进制,如"/10"
-xx以16进制形式显示所有字符串
-a column设置显示系统调用返回值的列位置,默认为40(从0开始),即"="出现在第40列
-e expr指定一个表达式,用于限定跟踪哪些事件及如何跟踪。其格式为[qualifier=][!]all或[qualifier=][!]value1[,value2]…。
qualifier取值为trace(默认)、abbrev、verbose、raw、signal、read或write。value是用于限定的符号(包括all和none)或数字。感叹号为否定符号,如-eopen等价于-e trace=open,表示只跟踪open系统调用;而-e trace=!open表示跟踪除open外的其他系统调用。
注意某些shell用!表示执行历史记录里的命令,此时可能借助引号、转义符号(/)。
-e trace=set:跟踪指定的系统调用列表,如-e trace=open,close,read,write表示只跟踪这四种系统调用。默认为set=all。
-e trace=file:跟踪以指定文件名做参数的所有系统调用。
-e trace=process:跟踪涉及进程管理的所有系统调用,可用于观察进程的fork、wait和exec阶段。
-e trace=network:跟踪网络相关的所有系统调用。
-e strace=signal:跟踪所有与系统信号相关的系统调用。
-e trace=ipc:跟踪所有与进程间通信有关的系统调用。
-e abbrev=set:指定哪些系统调用中的大型数组或结构体内容缩减显示,如strace -e abbrev=execve ./test仅显示execve调用中argv[]和envp[]的部分内容。默认为abbrev=all, abbrev=none等价于-v选项。
-e verbose=set:指定哪些系统调用中的大型数组或结构体内容完整显示,集合外的调用其数组或结构体显示为地址。默认为verbose=all。
-e raw=set:指定哪些系统调用中的参数以原始未解码的形式(即16进制)显示。当用户不信任strace解码或需要了解参数实际数值时有用。
-e signal=set:跟踪指定的信号列表,默认为signal=all。如signal=!SIGIO(或signal=!io)表示不跟踪SIGIO信号。
-e read=set:以16进制和ASCII码对照形式显示从指定文件描述符中读出的所有数据,如-e read=3,5可观察文件描述符3和5上的输入动作。该选项独立于系统调用read的常规跟踪(由-e trace=read选项控制)。
-e write=set:以16进制和ASCII码对照形式显示写入指定文件描述符的所有数据。
-o filestrace输出信息默认显示到标准错误输出,该选项将输出信息写入文件file中。以下两条命令等效:
strace -c -o test.txt ./test
strace -c ./test 2>test.txt
-O overheadSet the overhead for tracing system calls to overhead microseconds. This is useful for overriding the default heuristic for guessing how much time is spent in mere measuring when timing system calls using the -c option. The acuracy of the heuristic can be gauged by timing a given program run without tracing (使用time命令) and comparing the accumulated system call time to the total produced using -c.
-p pid指定待跟踪的进程号(pid),可用Ctrl-C终止跟踪而被跟踪进程继续运行。可指定多达32个(-p pid)选项以同时跟踪多个进程。该选项常用于调试后台进程
-s strsize限制每行输出中字符串(如read参数)的最大显示长度,默认32字节。但文件名总是完整显示
-S sortby按指定规则对-c选项的输出直方图进行排序。sortby取值可为time、calls、name和nothing(默认time)
-u username用指定用户的UID和/或GID身份运行待跟踪程序
-E var=val将var=val放入命令的环境变量列表
-E var从命令的环境变量列表中移除var

命令举例

例如,命令strace -o out.txt -T -tt -e trace=all -p 2899表示跟踪2899进程的所有系统调用,并统计系统调用的时间开销,以及调用起始时间(以可视化的时分秒格式显示),最后将记录结果存入out.txt文件。

为便于说明,使用strace跟踪ls -l命令执行过程(strace ls -l),前几行输出如下:
在这里插入图片描述

strace记录程序所产生的每次系统调用,并以类似C的格式(无论创建该程序时使用何种编程语言)各自显示为单独的一行。每行起始为系统调用的函数名,括号内为参数,该调用的返回值则显示在等号右侧。当参数为数组或结构体时,显示其元素(方括号)或成员(花括号)内容,见execve和fstat64。当参数为bit时,使用方括号并用空格隔开每项参数,如sigprocmask(SIG_BLOCK,[CHLD TTOU],[]) = 0,第二个参数代表信号SIGCHLD和SIGTTOU;若bit型参数全部置位,则输出如sigprocmask(SIG_UNBLOCK,~[],NULL) = 0,此处第二个参数全部置位。
通过使用-c选项,strace可统计分析进程所有的系统调用(strace -c ./ChangeSysTime),如:
在这里插入图片描述

可看到程序调用哪些系统函数,调用次数、所耗时间及出错次数等信息,有助于分析程序运行速度瓶颈。同时注意到,settimeofday调用出错两次,而该函数在ChangeSysTime程序中被显式调用两次,亦即这两次调用均出错!但ChangeSysTime程序中并未对settimeofday调用作出错处理,故在运行中没有输出任何错误提示。假定程序源码不可修改,则此时就可借助strace找出错误所在(strace -e trace=settimeofday ./ChangeSysTime):
在这里插入图片描述
真相大白,原来调用settimeofday函数时因操作权限不够而被拒绝(需要root权限)!注意,第2、3和5行输出为ChangeSysTime程序打印输出。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2078734.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

园区中的智慧用电管理

随着物联网、云平台等新兴信息科技的日益成熟,未来园区用电管理的发展将更加智能化、信息化。近年来,越来越多的能源互联网企业为园区用电管理提供了解决方案,文献[1]提出基于大数据技术设计开发的智能电表远程抄表系统替代传统的人工抄表方法…

常用标准化图像分辨率

常用标准化图像分辨率 标准化图像格式通常指的是将图像数据转换为统一的、标准化的格式,以便于存储、传输和处理。这种格式化过程可能包括调整图像的大小、颜色空间转换、归一化像素值等。 以下是常见标准化图像名称及分辨率(在深度学习和计算机视觉领域…

衡石科技BI的API如何授权文档解析

授权说明​ 授权模式​ 使用凭证式(client credentials)授权模式。 授权模式流程说明​ 第一步,A 应用在命令行向 B 发出请求。 第二步,B 网站验证通过以后,直接返回令牌。 授权模式结构说明​ 接口说明​ 获取a…

【Qt学习】Qlabel 的核心属性 与 代码实例

文章目录 1. 介绍2. 显示文本3. 显示图片4. 设置文本对齐方式5. 设置自动换行、边距、缩进6. 设置伙伴 1. 介绍 在Qt学习的专题中,我们以及多次使用过QLabel,作用就是用于显示文本和图片; QLabel有以下 核心属性: 好的&#xf…

EasyCVR视频汇聚平台:巧妙解决WebRTC无法播放H.265视频的难题

随着科技的飞速发展,视频监控已经成为现代安全管理不可或缺的一部分,广泛应用于智慧工地、智慧煤矿、智慧工厂、智慧社区和智慧校园等多个领域。在这个过程中,视频编码技术和实时通信技术显得尤为重要。EasyCVR视频汇聚平台,凭借其…

Python中的Request请求重试机制例子解析

在Python中,使用Requests库实现请求的重试机制是一种常见的做法,尤其是在面对不稳定的网络环境或服务时。以下是一些实现重试机制的详细例子: 使用Sessions和HTTPAdapter:Requests库中的Session可以存储跨多个请求的共同设置&…

城市内涝积水监测预警系统应对强降雨挑战

近年以来,我国部分地区频繁遭遇强降雨或持续性降水挑战,城市排水系统不堪重负,内涝问题日益凸显,下穿隧道、立交桥下等低洼路段容易产生大量积水,防洪形势刻不容缓。 为有效应对强降雨带来的挑战,国信华源结…

国内十大物联网平台推荐

随着物联网技术的飞速发展,越来越多的企业和开发者开始探索如何利用这一技术来优化产品、提高效率和创造新的商业模式。在中国,众多的物联网平台如雨后春笋般涌现,它们各具特色,为企业提供了丰富的选择。以下是国内十大物联网平台…

人工智能任务6-基于FAISS数据库的应用:向量数据库的搭建与中文文本相似度搜索

大家好,我是微学AI,今天给大家介绍一下人工智能任务6-基于FAISS数据库的应用:向量数据库的搭建与中文文本相似度搜索。随着大数据时代的到来,如何高效地处理和检索海量文本数据成为了研究的热点。在这个信息爆炸的时代&#xff0c…

【MySQL进阶之路】什么是事务以及事务的操作

目录 什么是事务 事务的属性 事务的操作 查看数据库引擎 事务提交 开始一个事务 提交事务 创建一个保存点 回滚到保存点 结论 注意事项 个人主页:东洛的克莱斯韦克-CSDN博客 什么是事务 事务是由一条或多条DML语句构成的。其中多条DML语句的执行必须有两…

【一起学Rust | 框架篇 | Tauri2.0框架】rust和前端的相互调用(前端调用rust)

文章目录 前言1. 前端调用rust(command)1. 在后端定义一个command2. 注册command3. 前端调用command 2. 前端调用rust(event)4. command完整实例 前言 本期将继续接着上一期,继续探索tauri中rust和前端的相互调用&…

视觉SLAM十四讲-理论到实践课程作业笔记-第六讲-光流法和直接法

CH6_No1: 1-1. 光流法可分为哪几类? 答:正向和逆向,其中两种方法各又包含了直加法和组合法; 1-2 在 compositional 中,为什么有时候需要做原始图像的 wrap?该 wrap 有何物理意义? 答:我个人的理解此处的wrap就是…

大数据系统测试——大数据系统解析(下)

各位好,我是 道普云 欢迎关注我的主页 希望这篇文章对想提高软件测试水平的你有所帮助。 学习和理解大数据系统每一个层次需要解决的技术问题和对应的一些技术需求是对大数据系统进行软件测试的一个基础,上篇文章里我们已经跟大家分享了数据收集层、…

33.python socket

python socket编程 概念说明心跳包的作用基于以上知识的基础上我们来实现一个代码socket serversocket client执行结果 概念说明 socket传输数据是基于字节流的,默认情况下是无边界的字节流。 一般情况下数据里中包含心跳包和数据包。数据包就是我们实际需要发送给…

中国建筑轮廓数据

建筑轮廓数据是建筑的边界矢量数据,一般该数据属性中会记录对应建筑的高度或者楼层数,通过建筑轮廓数据置顶的高程字段拉伸,就可以得到建筑白盒模型,所以,我们在各类导航地图中看到的白盒模型,实际上是建筑…

深度剖析:医疗行业财务报表的核心要素与解析策略

在当今医疗行业中,财务报表分析扮演着至关重要的角色。医疗机构需要通过对财务数据的准确分析来做出关键决策,管理资源,改善效率,并确保最终提供高质量的医疗服务。本文将深入探讨医疗行业中财务报表分析的重要性、关键指标和分析…

《一种个性化逻辑定制与类置换方案》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数…

通过违法app发现大量网站被挂黑页

免责声明:文章来源于真实事件,关键信息已经打码处理,请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一…

AI搜索的商业模式困境:Perplexity从拒绝广告到高价广告的转变

随着人工智能技术的发展,AI搜索逐渐成为人们日常生活中不可或缺的一部分。在这个领域,Perplexity曾被认为是AI搜索领域的领军企业,以其强大的智能搜索能力脱颖而出。然而,随着OpenAI的SearchGPT发布在即,Perplexity似乎…

掌握结构型模式——全景回顾

在前几篇文章中,我们详细探讨了多种结构型设计模式,今天来进行一个大总结——结构型设计模式主要关注类与对象的组合和组织,确保我们能够构建出稳固、灵活且易于维护的软件系统。无论你是初学者还是有经验的开发者,这篇文章都会帮…