strace命令使用分析

article/2025/9/19 18:39:05

strace命令介绍与用法

1.1 strace概述

在操作系统中,进程分为用户态进程和内核态进程,应用程序运行在用户态,内核态负责对资源包括网络,磁盘,内存等管理,用户态进程要访问这些资源时,需要通过系统调用陷入内核态,由内核来统一管理和分配。
在这里插入图片描述
通过系统调用陷入内核态,或者应用程序运行过程中,产生的signal,都可以被strace捕获到,每个系统调用的名称,参数,返回值,调用时间通过标准错误输出或者-O选项写入到文件中,通过分析这些信息,可以在应用程序发生故障时,不用重新编译程序,就可以捕获当前进程内部正在做什么。

1.2 strace用法介绍

下面对strace各个参数的使用方法进行介绍。

1.2.1 strace -p pid

跟踪正在执行的进程,正在执行的系统调用,先来熟悉几个查找进程的命令,pidof 查看当前进行运行程序的进程pid,pstree,跟踪当前进程pid查看,进程树关系。
在这里插入图片描述
由图可知,server进程的pid为8146,其中8146创建了线程8147,通过pidof和pstree可以查看进程pid和pstree查看进程树关系。
现在使用strace -p 8147跟踪这个进程当前在进行哪些系统调用。
在这里插入图片描述
从图3可知,进程8147进在执行的系统调用是read,write,epoll_wait等,还有这些系统调用的参数,和返回值,从而大概知道进程8147正在执行的情况。

1.2.2 strace -i

现在在原来-p的基础上,加上-i参数,可以查看系统调用的入口指针。
通过(1.2.1)步骤,重新查看server的pid,并用strace -p pid -i跟踪系统调用并查看系统调用入口指针。
在这里插入图片描述
其中最左侧部分就是系统调用入口指针。

1.2.3 strace -t

在原来-p 的基础上加上-t,跟踪系统调用,同时查看系统调用的时间戳。结合步(1.2.1)使用strace -p pid -t 跟踪系统调用,同时查看。
在这里插入图片描述
其中最左侧的是系统调用的时间戳。
其中strace -t 是精确度是时分秒,-tt是精确为s。
用法:strace -p pid -tt

在这里插入图片描述

1.2.4 strace -T

用于查看系统调用中,每个系统调用花费的时间。
在1.2.1的基础上,加上-T选项,strace -p pid -T。
在这里插入图片描述
如图7所示,其中最右侧部分是每个系统调用花费的时间。

1.2.5 strace -yy

用于查看,进行tcp/udp read/write时,查看socket的五元组详细信息(比如ip,port,tcp)。
在这里插入图片描述

如上图8所示,加上-yy参数之后,可以看到socket文件描述符5对应的五元组信息为:
TCP:[172.16.8.188:1883->172.16.8.188:33196]。在一些服务端与客户端的交互中可以用来分析排查问题。

1.2.6 strace -c

用于统计每个系统调用,时间,调用次数,错误次数等。
用法:strace -p pid -c
在这里插入图片描述

运行一段时间后,ctrl+c终止

在这里插入图片描述

有颜色部分,从左到右,分别是运行时间面分比,运行时间,每次调用花费的时间(单位usecs),调用总次数,调用出错次数,对应的API。

1.2.7 strace -f

跟踪系统调用的同时,同时打印pid;如果是父进程,则同时跟踪打印子进程的系统调用。
查看server程序的父进程pid。
在这里插入图片描述
strace -p pid -f
在这里插入图片描述

加上-参数之后,其中最左侧可以显示整个应用程序父进程(包括父进程)下的所有子进程的系统调用。

1.2.8 strace -e

前面介绍strace用法,一次性打印所有系统调用,现在加上-e参数之后,可以过滤掉一些系统调用,查看自己想要查看的系统调用,比如只跟踪网络,ipc通信或者只跟踪某个API比如read相关的系统调用。
1. -e trace=desc
跟踪和文件描述符相关API,比如write/read/select/epoll等
测试用例代码:
https://github.com/jorinzou/linux_command/tree/master/strace/code_1
code_1是server和client通信的例程,
常试用-e trace=desc,查看看server内部进行的系统调用。
分别编译和运行server和client。
在这里插入图片描述
通过图,可以查看到5,1,4,相关文件描述符相关的系统调用API。

2. -e trace=file
跟踪和文件访问相关的调用(参数中有文件名)。
运行实例:
https://github.com/jorinzou/linux_command/tree/master/strace/trace_file
在后台用strace跟踪
在这里插入图片描述
3. -e trace=process和进程管理相关的调用,比如fork/exec/exit_group
测试用例:https://github.com/jorinzou/linux_command/tree/master/strace/trace_process
运行进程,并用pstree -p查看进程树关系,找到父进程,并用strace跟踪。

4. -e trace=ipc 进程间通信相关,比如shmget等
测试用例:
https://github.com/jorinzou/linux_command/tree/master/strace/trace_ipc
运行此实例代码,并另外打开一个窗口,进行跟踪
strace -p pidof b.out -e trace=ipc
在这里插入图片描述

5. -e trace=signal 信号发送和处理相关,比如kill/sigaction

运行相关的实现代码进程,并执行以下命令
strace -p pidof signal -e trace=signal
测试用例:
https://github.com/jorinzou/linux_command/tree/master/strace/trace_process

在这里插入图片描述

1.3 案例:结合strace分析线程间死锁问题

两个或者多个进程/线程竞争共享资源导致互相等待的现象等待的线程无法获得资源进而往下执行。
常见死锁的情形:
线程1获得锁A,等待锁B,线程2获得锁B,等待锁A。

在这里插入图片描述
产生死锁的四个条件

  1. 互斥条件,一个资源只能被一个进程/线程使用
  2. 请求与保护条件,一个进程/线程请求资源而阻塞,对此保持不放
  3. 不剥夺条件,一个进程/线程获得共享资源,如果没有使用完,不能被剥夺
  4. 循环等待条件,多个进程/线程形成头尾先接的等待

避免死锁的方法

  1. 银行家算法
  2. 有序资源分配法
  3. 锁的范围小
  4. 锁的临界区内代码执行时间短

结合strace分析多线程之间产生死锁
实例代码:
https://github.com/jorinzou/linux_command/tree/master/strace/dead_lock

编程运行实例代码:
在这里插入图片描述

使用pstree -p | grep a.out,查看程序的进程树关系和pid,并用strace跟踪子线程pid,可以看出10856线程和10857线程被阻塞在同一个锁0x6010c0,初步定为这两个线程竞争同一个锁导致死锁。

在这里插入图片描述

使用top -p ppid(父进程pid) -H,查看这些死锁的pid对应的线程是哪些线程,这个需要提前在代码中设置线程名:如:pthread_setname_np(t2, “Thread2Task”);

在这里插入图片描述

从上图可以看出,线程对应的线程函数,进一步断定,Thread2Task和Thread3Task发生了死锁。


http://chatgpt.dhexx.cn/article/EXG4T2vd.shtml

相关文章

【已解决】安装Ubuntu时怎样分区--利用EasyBCD在win7下进行ubuntu安装(双系统)时遇到报错:没有根文件系统,请回到分区菜单以修正此错误

由于我们离不开Windows操作,并且因为不熟悉而不习惯ubuntu的操作方式,固采用Win7和Ubuntu双系统方式比较合理。在Win7基础上安装Ubuntu,Ubuntu会自动建立一个启动菜单,让我们在开机时自行选择启动Win7还是Ubuntu。 1、在win7上安…

根文件系统挂载过程—基于linux3.10

本文基于linux3.10某一嵌入式系统,该文件系统的配置选项设置如下: 图1.1 根文件系统配置选项设置 两行配置如下: [*] Initial RAMfilesystem and RAM disk (initramfs/initrd) support (usr/rootfs.cpio.gz)Initramfs source file(s) 这两…

JFFS2根文件系统制作

一.根文件系统简介 根文件系统首先是内核启动时所mount的第一个文件系统,内核代码映像文件保存在根文件系统中,系统引导启动程序会在根文件系统挂载之后从中把一些初始化脚本(如inittab、rcS)和服务加载到内存中去运行。 文件系统…

ARM Linux启动流程-根文件系统的加载

前言 在Kernel启动的初始阶段,首先去创建虚拟的根文件系统(rootfs),接下来再去调用do_mount来加载真正的文件系统,并将根文件系统切换到真正的文件系统,也即真实的文件系统。   接下来结核内核代码(内核版本:linux-…

怎么使用 Buildroot 构建根文件系统

1. Buildroot 简介 制作根文件系统有归多种方法: ① 使用Busybox手工制作 Busybox本身包含了很了Linux命令,但是要编译其他程序的话需要手工下载、编译,如果它需要某些依赖库,你还需要手工下载、编译这些依赖库。 如果想做一个极…

一文讲解Linux内核中根文件系统挂载流程

根文件系统的概念 根文件系统是控制权从linux内核转移到用户空间的一个桥梁。linux内核就类似于一个黑匣子,只向用户提供各种功能的接口,但是功能的具体实现不可见,用户程序通过对这些功能接口的不同整合实现不同的功能需求。以用户的角度来…

【linux kernel】挂载根文件系统之rootfs

挂载根文件系统之rootfs 文章目录 挂载根文件系统之rootfs一、开篇二、rootfs根文件系统(2-1)初始化rootfs(2-2)挂载rootfs文件系统(2-3)创建简单的rootfs根文件系统目录和文件(2-4)…

2021年Linux技术总结(三):根文件系统(rootfs)

# 一、根文件系统简介 Linux系统三大块:U-boot、kernel以及最后这个rootfs,跟文件系统。在kernel中,启动流程的最后会调用 prepare_namespace 函数,挂载根文件系统,这里就是挂载的本篇要说的。 根文件系统保存了内核代…

详解制作根文件系统

目录 前言 具体步骤 一.编译/安装busybox,生成/bin、/sbin、/usr/bin、/usr/sbin目录 二.利用交叉编译工具链,构建/lib目录 三.手工构建/etc目录 四.手工构建最简化的/dev目录 五.创建其它空目录 六.配置系统自动生成/proc目录和构建…

根文件系统理解

文件系统概念 文件系统是一些代码,是一套软件,这套软件的功能就是对存储设备的扇区进行管理,将这些扇区的访问变成了对目录和文件名的访问。我们在上层按照特定的目录和文件名去访问一个文件时,文件系统会将这个目录文件名转换成对…

linux之根文件系统

前言 1、板卡上电后首先由UBOOT启动初始化板卡,将Linux内核移到内存中运行 2、由linux内核自行做了初始化等操作,挂在了第一个应用程序上(根文件系统/linuxrc) 3、根文件系统会提供磁盘管理服务,glibc设备节点&…

Linux:根文件系统构建

文章目录 一、编译 BusyBox 构建根文件系统1.创建BusyBox路径并解压2.修改顶层Makefile3.修改 busybox 源码4.配置busybox5.编译busybox6.向 rootfs 的“/lib”目录添加库文件7.向 rootfs 的“usr/lib”目录添加库文件创建其他文件夹 二、NFS挂载根文件系统1.bootargs 环境变量…

制作嵌入式Linux根文件系统

文章目录 1. 根文件系统布局2. 使用BusyBox生成二进制工具2-1. 获取BusyBox源码2-2. 配置BusyBox2-2-1. 选择编译静态库2-2-2. 选择交叉编译工具链2-2-3. 选择安装目录2-2-4. 编译安装 3. 构建根文件系统3-1. 完善目录结构3-2. 添加C运行库文件3-3. 添加初始化配置脚本3-3-1. 修…

[架构之路-30]:目标系统 - 系统软件 - Linux OS根文件系统rootfs的概念、组成、制作以及用busybox制作根文件系统

目录 前言: 第1章 什么是根文件系统 1.1 什么是文件 1.2 什么是文件系统 1.3 文件系统组织文件的方式:树形结构 1.4 统一的虚拟文件系统 1.5 物理存储介质与物理文件系统类型 1.5 什么是根文件系统 第2章 根文件系统的标准结构 2.1 根文件系统…

安装Ubuntu 16.04时出现:没有定义根文件系统,请到分区菜单修改

在安装Ubuntu 16.04时,尤其是选项空闲硬盘新建分区安装时,容易出现这种情况,这个是由于没有配置挂载点导致的,解决方法如下: 在挂在点输入“/”。 原理: Linux和Windows的文件系统不一样&#x…

Ubuntu提示“没有根文件系统 ”

安装Ubuntu时,提示“没有定义根文件系统” 原因:分区错误 解决: 将Ubuntu分区,删除重新创建分区,注意挂载点为“/” 此时就可以单击“继续”,进行下一步安装 以上分区方式,是没有交换分区的,下面提供两种带交换分区的分区方式: 第一种,包含4个分区,分别为 /分区(…

安装linux显示没有定义根文件系统,XP用Wubi安装Ubuntu提示“没有定义根文件系统,请返回分区菜单...

在安装Ubuntu时,到自定义分区一步时,会出现“没有根文件系统”,这时千万别将硬盘分区表重建,那样会让硬盘到数据都格式化到,你只需在ext4 或者 ext3 分区项上双击,加上挂载点为“\”就可以了。 有图有真相&…

在虚拟机安装中遇到的问题

问题一:在命令行模式下输入ifconfig时,显示系统不能识别这个命令,需要安装,输入sudo apt install net-tools。 问题二:sudo命令输入密码时,光标不移动,只要输入正确密码,回车就可以。…

安装Ubuntu时,提示“没有根文件系统 ”

安装Ubuntu时,提示“没有定义根文件系统” 原因:分区错误 解决: 将Ubuntu分区,删除重新创建分区,注意挂载点为“/” 此时就可以单击“继续”,进行下一步安装 以上分区方式,是没有交换分区的&a…

synchronized,voliate-详解

一.synchronized底层原理: synchronized关键字,在底层编译后的jvm指令中,会有monitorenter(枷锁)和monitorexit(释放锁)两个指令. monitorenter指令执行的时候会干什么呢? 每个对象都有一个关联的monitor,比如一个对象实例就有一个monitor…