strace 用法介绍

news2024/11/15 12:16:54

strace 是什么

strace 是一个可用于诊断和调试的 Linux 用户空间跟踪器。我们用它来监控用户空间进程和内核的交互,比如系统调用、信号传递、进程状态变更等。

strace 作为一种动态跟踪工具,能够帮助我们高效地定位进程和服务故障。它像是一个侦探,打开应用进程的这个黑盒子,通过系统调用的蛛丝马迹,告诉你进程大概在干嘛,进而找到异常的真相。

strace 怎么用

运行模式

strace 有两种运行模式。

一种是通过它启动要跟踪的进程。用法很简单,在原本的命令前加上 strace 即可。

比如我们要跟踪 “/usr/local/bin/a.out” 这个命令的执行,可以这样:

strace /usr/local/bin/a.out

另外一种运行模式,是跟踪已经在运行的进程,在不中断进程执行的情况下,理解它在干嘛。

这种情况,给 strace 传递个 -p pid 选项即可。

比如,a.out 进程的 pid 是 345,可以这样:

strace -p 345

完成跟踪时,按 Ctrl + C 结束 strace 即可。

常用选项

从一个示例命令来看:

strace -tt -T -v -f -e trace=file -o /tmp/strace.log -s 1024 -p 345
  • -tt:在每行输出的前面,显示毫秒级别的时间
  • -T:显示每次系统调用所花费的时间
  • -v:对于某些相关调用,把完整的环境变量,文件 stat 结构等打出来
  • -f:跟踪目标进程,以及目标进程创建的所有子进程
  • -e:控制要跟踪的事件和跟踪行为,比如指定要跟踪的系统调用名称
  • -o:把 strace 的输出单独写到指定的文件
  • -s:当系统调用的某个参数是字符串时,最多输出指定长度的内容,默认是 32 个字节
  • -p:指定要跟踪的进程 pid,要同时跟踪多个 pid,重复多次 -p 选项即可
  • -c:统计系统调用的次数和其所花的时间

这里特别说下 strace 的 -e trace 选项。

要跟踪某个具体的系统调用,如 -e trace=open 即可。

但有时候我们要跟踪一类系统调用,比如所有和文件名有关的调用、所有和内存分配有关的调用。

如果人工输入每一个具体的系统调用名称,可能容易遗漏。

于是 strace 提供了几类常用的系统调用组合名字。

  • -e trace=file 跟踪和文件访问相关的调用(参数中有文件名)
  • -e trace=process 和进程管理相关的调用,比如 fork/exec/exit_group
  • -e trace=network 和网络通信相关的调用,比如 socket/sendto/connect
  • -e trace=signal 信号发送和处理相关,比如 kill/sigaction
  • -e trace=desc 和文件描述符相关,比如 write/read/select/epoll
  • -e trace=ipc 进程间通信相关,比如 shmget

strace 问题定位案例

定位进程异常退出

/usr/local/samba/bin/nmbd 启动失败,nmbd 是一个域名服务的进程。

这个服务进程是开源代码编译出来的,也就是说,并不是我们自己开发的代码,因此该服务进程的启动流程我们并不熟悉。像这样的情况,可以用 strace 来跟踪看看,到底是哪里出现了异常。

strace -tt -T /usr/local/samba/bin/nmbd

在这里插入图片描述

咦?看到 nmbd 进程 exited with 0 正常退出了,考虑到这个进程是个守护进程,主进程确实会 exit 的。

再看到有个 clone 的系统调用,想到 fork 这个系统调用最终调用的是 clone,就知道 nmbd 进程创建了一个子进程,然后父进程就退出了。所以要加一个参数 -f 来跟踪子进程

strace -tt -T -f /usr/local/samba/bin/nmbd

在这里插入图片描述

看到确实子进程是异常退出了,exited with 1,所以 nmbd 进程启动失败。

对比了一下之前版本 OK 的启动 log。

在这里插入图片描述

发现 /usr/local/samba/var/nmbd 这个目录有异常

OK 时是一个普通的目录

NG 时是一个软链接

最终查看了相关代码,改成目录,nmbd 进程就可以正常启动了

性能分析

假如有个需求,统计某个目录 cpp 文件的代码行数。这里提供两个 Shell 脚本实现:

poor_script.sh

#!/bin/bash
total_line=0
while read filename; do
     line=$(wc -l $filename | awk '{print $1}')
     (( total_line += line ))
done < <(find . -type f -iname '*.cpp')
echo "total line: $total_line"

good_script.sh

#!/bin/bash

find . -type f -iname '*.cpp' -print0 | wc -l --files0-from=- | tail -n 1

两段代码实现的目的是一样的。我们通过 strace 的 -c 选项来分别统计两种版本的系统调用情况和其所花的时间(使用 -f 同时统计子进程的情况)

strace -c -f ./poor_script.sh
在这里插入图片描述

strace -c -f ./good_script.sh
在这里插入图片描述

从两个输出可以看出,good_script.sh 很快就可以得到结果:95985 行。它大部分的调用(calls)开销是文件操作(read/open/write/close)等,统计代码行数本来就是干这些事情。

而 poor_script.sh 完成同样的任务则花了更久的时间。它大部分的调用开销都在进程和内存管理上(wait4/mmap/getpid…)。

实际上,从两个图中 clone 系统调用的次数,我们可以看出 good_script.sh 只需要启动 3 个进程,而 poor_script.sh 完成整个任务居然启动了 392 个进程,而进程创建和销毁的代价是相当高的,性能不差才怪。如果目录下的 cpp 文件再多一些,那要花费的时间将会更久!

总结

当发现进程或服务异常时,我们可以通过 strace 来跟踪其系统调用,“看看它在干啥”,进而找到异常的原因。熟悉常用系统调用,能够更好地理解和使用 strace。

当然,strace 也不是万能的,当目标进程卡死在用户态时,strace 就没有输出了。

这个时候我们需要其他的跟踪手段,比如 gdb 等。

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

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

相关文章

企业电子招投标采购系统源码之系统的首页设计

​​ 功能模块&#xff1a; 待办消息&#xff0c;招标公告&#xff0c;中标公告&#xff0c;信息发布 描述&#xff1a; 全过程数字化采购管理&#xff0c;打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力&#xff0c;为…

ThreadLocal解析

ThreadLocal是一个存储线程本地变量的对象&#xff0c;在ThreadLocal中存储的对象在其他线程中是不可见的&#xff0c;本文介绍ThreadLocal的原理。 1、threadLocal使用 有如下代码&#xff1a; Slf4j public class TestThreadLocal {public static void main(String[] args…

干货!设备管理包括哪些内容?

本文将为您介绍&#xff1a;1、设备管理的内容有哪些2、好用的设备管理软件&#xff1b; 设备管理在企业管理中非常重要&#xff1a;设备是企业安全生产的前提&#xff0c;没有安全生产&#xff0c;一切工作都可能是无用功&#xff1b; 而好的设备管理可以极大地提高生产效率…

【数据库】MySQL数据库约束(六大约束)

目录 1.数据库约束 1.1约束类型 1.2 非空约束&#xff08;NOT NULL &#xff09; 1.3 唯一约束&#xff08;UNIQUE&#xff09; 1.4默认值约束&#xff08;DEFAULT &#xff09; 1.5主键约束&#xff08;PRIMARY KEY&#xff09; 1.6外键约束&#xff08;FOREIGN KEY &…

安全漏洞修复帖

对于项目漏洞都是一堆又不重要又很重要的事情一、修复HTTP 响应头缺失NginxTomcat响应头&#xff1a;值二、会话 Cookie 中缺少 secure 属性三、Html form 表单没有 CSRF 防护Security的示例Shiro的示例四、Host 头攻击NginxTomcatApache五、开启 options 方法一、修复HTTP 响应…

【设计模式】适配器模式和桥接模式

适配器模式 适配器模式 : 就是将一个类的接口变成客户端所期望的另一种接口&#xff0c;使得原本因为接口不匹配而无法一起工作的接口可以正常工作。属于结构型模式 比方说我有一个A牌子的奶瓶&#xff0c;然后买了个B牌子的奶嘴&#xff0c;不能匹配怎么办? 再买一个转换器…

Python3-输入和输出

Python3 输入和输出 输出格式美化 Python两种输出值的方式: 表达式语句和 print() 函数。 第三种方式是使用文件对象的 write() 方法&#xff0c;标准输出文件可以用 sys.stdout 引用。 如果你希望输出的形式更加多样&#xff0c;可以使用 str.format() 函数来格式化输出值。…

2020蓝桥杯真题洁净数 C语言/C++

题目描述 小明非常不喜欢数字 2&#xff0c;包括那些数位上包含数字 2 的数。如果一个数的数位不包含数字 2&#xff0c;小明将它称为洁净数。 请问在整数 1 至 n 中&#xff0c;洁净数有多少个&#xff1f; 输入描述 输入的第一行包含一个整数 n(1≤n≤10^6)。 输出描述 输…

VS Code 解决 SpringBoot 项目启动时报 Failed to refresh live data from process **** 的问题

问题 SpringBoot 启动后 &#xff0c;VS Code 报错 Failed to refresh live data from process ****。 现场是&#xff0c;SpringBoot 项目启动时&#xff0c;VS Code 将进行如下刷新&#xff0c;图片如下所示 当刷新 10 次以后&#xff0c;如果还是失败&#xff0c;则会抛出…

C++ queue的以及优先级队列(堆)的介绍和使用

因为队列与之前学习的栈等使用方法比较类似&#xff0c;所以对此进行简单介绍1 queue的介绍1. 队列是一种容器适配器&#xff0c;专门用于在FIFO上下文(先进先出)中操作&#xff0c;其中从容器一端插入元素&#xff0c;另一端提取元素。2. 队列作为容器适配器实现&#xff0c;容…

基于RK3588人工智能大算力5网口工业交换机

RK3588是瑞芯微旗下最新的8K旗舰SoC芯片&#xff0c;采用ARM架构&#xff0c;主要用于PC、个人移动互联网设备、边缘计算和其他数字多媒体应用。RK3588集成了四核Cortex-A76和四核Cortex-A55&#xff0c;以及单独的NEON协处理器&#xff0c;支持8K视频编解码。许多功能强大的嵌…

肠道菌群与健康:探究发酵食品、饮食方式、益生菌和后生元的影响

谷禾健康 肠道微生物群之间编织了一个复杂的相互作用网络&#xff0c;影响人体的营养吸收和代谢&#xff0c;免疫功能等&#xff0c;对我们的健康状态有很大的影响。 我们知道&#xff0c;肠道微生物群具有多样性&#xff0c;平衡性&#xff0c;稳定性等特征&#xff0c;但同时…

c语言面试题目整理

1、static有什么用途&#xff1f; 在C语言中&#xff0c;static主要定义全局静态变量&#xff0c;定义局部静态变量&#xff0c;定义静态函数 限制变量的作用域&#xff0c;设置变量的存储域。 static 关键字主要有两种作用&#xff1a; 第一&#xff0c;为某特定数据类型或对…

05 C语言数据类型

05 C语言数据类型 1、数据类型 编程语言对数据类型分为两派&#xff1a;一种认为要注重&#xff0c;一种认为可以忽视。 C语言类型 1、整数 : char < short < int < long < long long &#xff0c;bool 2、浮点数&#xff1a;float < double < long doub…

ChatGPT狂飙,文心一言会是李彦宏的“奇兵”吗?

“这是搜索领域新的一天。”前不久&#xff0c;微软CEO纳德拉在新版搜索引擎Bing的发布仪式上如此表示。Bing的技术支持&#xff0c;正是来自最近火遍全球的AI聊天机器人ChatGPT。仅仅两个月&#xff0c;OpenAI公司旗下的ChatGPT月活就超过1亿&#xff0c;成为史上增长最快的消…

Idea springboot springCloud热加载热调试常用的两种方式

场景描述 在项目开发的过程中&#xff0c;需要修改调试的时候偶每次都需要重启项目浪费时间&#xff0c;下面是我整理的两种常用的两种方式方式一 修改启动配置方式&#xff08;主要针对debug模式下&#xff09; 点击启动配置》edit configrations… configration下面修改Upd…

Win11+VS2019编译PCL1.12含gpu过程记录

之前直接用AllinOne安装了配置了一个pcl但是没有CUDA的支持&#xff0c;跑的速度很慢&#xff0c;现在想要集成到GPU上&#xff0c;需要重新编译一下PCL&#xff0c;之前自己编译一直有问题&#xff0c;而且还自己单独编译了相关的依赖库&#xff0c;结果发现只需要用AllinOne里…

《C++ Primer Plus》(第6版)第9章编程练习

《C Primer Plus》&#xff08;第6版&#xff09;第9章编程练习《C Primer Plus》&#xff08;第6版&#xff09;第9章编程练习1. 打印字符串2. 修改程序清单9.93. chaff4. sales《C Primer Plus》&#xff08;第6版&#xff09;第9章编程练习 1. 打印字符串 下面是一个头文件…

开源工具系列5:DependencyCheck

Dependency-Check 是 OWASP&#xff08;Open Web Application Security Project&#xff09;的一个实用开源程序&#xff0c;用于识别项目依赖项并检查是否存在任何已知的&#xff0c;公开披露的漏洞。 DependencyCheck 是什么 Dependency-Check 是 OWASP&#xff08;Open Web …

宿主机连接virtualbox中网络

背景&#xff1a;宿主机ubuntu&#xff0c;virtualbox中window中有VPN需要在宿主机也能共享到VPN网络。在virtualbox中添加host-only网络&#xff0c;取名vboxnet0这里在菜单栏中: 管理 -> 工具 -> network managervboxnet0在宿主的IP为192.168.56.1宿主机上运行ifconfig…