Linux命令之strace命令

article/2025/9/19 18:35:46

一、命令简介

  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其他参数打印版本信息

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

相关文章

strace命令使用分析

strace命令介绍与用法 1.1 strace概述 在操作系统中,进程分为用户态进程和内核态进程,应用程序运行在用户态,内核态负责对资源包括网络,磁盘,内存等管理,用户态进程要访问这些资源时,需要通过…

【已解决】安装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…