一,strace的用途

strace  是最常用的跟踪进程系统调用的工具。

说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnblogs.com/architectforest

对应的源码可以访问这里获取: https://github.com/liuhongdi/

说明:作者:刘宏缔 邮箱: 371125307@qq.com

二,查看strace所属的包及安装

1,strace所属的包

[root@blog ~]# whereis strace
strace: /usr/bin/strace /usr/share/man/man1/strace.1.gz [root@blog ~]# rpm -qf /usr/bin/strace
strace-4.24-5.el8.x86_64

2,如果找不到strace命令,可以使用yum安装

[root@blog ~]# yum install strace   

三,查看strace的版本和帮助

1,查看版本

[root@blog ~]# strace -V
strace -- version 4.24
Copyright (c) 1991-2018 The strace developers <https://strace.io>.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Optional features enabled: stack-trace=libdw stack-demangle m32-mpers mx32-mpers

2,查看帮助

[root@blog ~]# strace -h 

四,strace常用参数

# -f表示跟踪由fork调用所产生的子进程和子线程

# -T 显示每一次调用所耗的时间长

# -t 在输出中的每一行前加上时间信息.

# -tt表示显示跟踪时间, 微秒级别的时间戳

# -e 展示特定的系统调用(例如,open,write等等)

# -o 把strace命令的输出结果保存到指定的文件中

# -r 系统调用之间的相对时间戳

# -c 统计每一系统调用的所执行的时间,次数和出错的次数等

五,strace的应用例子:

1,追踪指定pid的进程:

# -p : 指定进程的pid

[root@blog ~]# strace -p 7491

2,追踪一个进程时加上线程:

# -f表示跟踪子进程和子线程

#-T表示显示系统调用的时长,

#-tt表示显示跟踪时间

[root@blog ~]# strace -f -T -tt -p 8240 

说明:调用的时长:显示为形如:<0.059084>

单位是秒,精确到微秒级别

3,只追踪指定的操作:

# -f表示跟踪子进程和子线程

#-T表示显示系统调用的时长,

#-tt表示显示跟踪时间

#-e 指定特定的系统调用

[root@blog ~]# strace -f -p 8240 -T -tt -e fdatasync

4,追踪一个指定命令的执行

[root@blog ~]# strace ls

5,把跟踪结果保存到指定的文件中

#-o  指定输出文件的路径

[root@blog ~]# strace -p 8240 -o /data/logs/stra_ls.txt

6,输出系统调用的统计结果,即每个命令的占比

[root@blog ~]# strace -p 8240 -c
strace: Process 8240 attached
strace: Process 8240 detached
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
30.22 0.000679 4 143 72 read
26.57 0.000597 8 71 openat
24.25 0.000545 7 71 epoll_wait
10.81 0.000243 3 71 close
8.14 0.000183 2 71 getpid
------ ----------- ----------- --------- --------- ----------------
100.00 0.002247 427 72 total

六,-e参数trace的常用例子:

-e trace=ipc 进程见同学相关,比如shmget等

-e trace=set 只跟踪指定的系统 调用.例如:-e trace=open.

-e trace=desc  和文件描述符相关,比如write/read/select/epoll等

-e trace=file 只跟踪有关文件操作的系统调用.

-e trace=process 只跟踪有关进程控制的系统调用.

-e trace=network 跟踪与网络有关的所有系统调用.

-e trace=signal 跟踪所有与系统信号有关的 系统调用

-e trace=ipc 跟踪所有与进程通讯有关的系统调用

例:跟踪与网络有关的系统调用

[root@blog ~]# strace -Te trace=network curl

七,strace结果中的常见分析

1,如果应用打开分区时使用O_DIRECT,O_DIRECT 表示以直接读取的方式打开,这会绕过系统的缓存。

直接从磁盘读写的速度,自然远慢于对缓存的读写。会导致速度变慢

2,write(3, "2018-12-05 15:23:01,709 - __main"..., 314572844

) = 314572844

表示进程向文件描述符编号为 3 的文件中,写入了 300MB 的数据

3,write 或者 fdatasync都属于对磁盘的写操作

八,查看centos的版本:

[root@blog ~]# cat /etc/redhat-release
CentOS Linux release 8.0.1905 (Core)

centos8平台使用strace跟踪系统调用的更多相关文章

  1. [strace]跟踪进程的系统调用

    转自:https://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316692.html 简介 strace常用来跟踪进程执行时的系统调用和所接收的信号 ...

  2. strace跟踪多进程与内核的交互

    1.ptrace的说明 ptrace原型: #include <sys/ptrace.h> long ptrace(enum __ptrace_request request, pid_t ...

  3. Strace跟踪解决expect乱码问题

    --Strace跟踪解决expect乱码问题 ----------------------------------2014/07/27 情景:需要在本机抓去另外一台远程数据库中的数据. 执行语句:./ ...

  4. 使用strace命令跟踪系统调用

    一.是什么strace? strace常用来跟踪进程执行时的系统调用和所接收的信号. 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由 ...

  5. 28、应用调试之strace命令来跟踪系统调用

    strace是个工具,在使用时需要先按照,见韦东山书籍: 1.tar xjf starce-4.5.15.tar.bz2 2.cd strace-4.5.15/ 3.patch -p1 < .. ...

  6. 使用strace 工具跟踪系统调用和信号

    使用strace来执行程序,它会记录程序执行过程中调用,接收到的信号,通过查看记录结果,就可以知道程序打开哪些文件,进行哪些读写,映射哪些内存,向系统申请多少内存等信息 strace 移植 下载str ...

  7. strace跟踪线程调用

    方法一:strace -fp pid , 可以跟踪所有线程, 进程的系统调用. [root@xxxx]strace -p 24091 Process xxx attached - interrupt ...

  8. strace命令 系统调用

    简介 strace常用来跟踪进程执行时的系统调用和所接收的信号. 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核 ...

  9. 基于Linux-3.9.4内核的GDB跟踪系统调用实验

    382 + 原创作品转载请注明出处 + https://github.com/mengning/linuxkernel/ 一.实验环境 win10 -> VMware -> Ubuntu1 ...

随机推荐

  1. ajax之---“伪”ajax

    views.py def ajax1(request): ret={'status':'true','message':'successful'} return HttpResponse(json.d ...

  2. 图灵机器人api的使用方法含微信版本和网页版

    访问图灵机器人官网http://www.tuling123.com/ 注册一个新的机器人账号 注册成功后转到主页 点击我的机器人>创建机器人>微信机器人 填写基本信息 点击微信介入> ...

  3. 升级微服务架构5:API网关

    API网关是一个服务器,是系统的唯一入口.从面向对象设计的角度看,它与外观模式类似.API网关封装了系统内部架构,为每个客户端提供一个定制的API.它可能还具有其它职责,如身份验证.监控.负载均衡.缓 ...

  4. SpringBoot框架:使用mybatis连接mysql数据库完成数据访问(二)

    一.导入依赖包 1.在创建项目时勾选: 勾选SQL中的JDBC API.MyBatis Framework.MySQL Driver,创建项目后就会自动配置和引入这些包. 2.在pom.xml文件中添 ...

  5. 栈的Java实现-分别使用数组和链表

    栈是非常重要的数据结构,栈具有后进先出的特点. 在JVM内部,每个线程维护一个栈,对于每个方法调用,入栈一个元素,成为栈帧,当方法执行完成后,对应的栈帧出栈. 栈帧中,也包含一个栈,称为操作数栈. 一 ...

  6. Redis5设计与源码分析读后感(三)跳跃表

    一.引言 有序集合在日常开发中相当常见,比如做排名等相关的功能,肯定要用到排序的功能,那么常见底层实现有很多种: 数组 :不便于元素的插入和删除 链表 :查询效率低,需要遍历所有元素 平衡树OR红黑树 ...

  7. Redis 4.0.2安装与卸载

    安装 使用root用户安装: 1.wget http://download.redis.io/releases/redis-4.0.2.tar.gz 2.tar -zxvf redis-4.0.2.t ...

  8. windows10 + docker利用文件映射进行编程开发

    0. 以安装swoole框架"easyswoole"举例,建议使用powershell或者cmder输入命令   1. 首先准备好window10专业版开启Hyper-V,然后下载 ...

  9. Java 文件 IO 操作

    window 路径分割符: \ 表示 windows 系统文件目录分割符 java 代码在 windows 下写某个文件的话需要下面的方式 D:\\soft\\sdclass.txt  其中一个单斜杠 ...

  10. Java知识系统回顾整理01基础06数组06二维数组

    一.一维数组和二维数组 这是一个一维数组, 里面的每一个元素,都是一个基本类型int int a[] =new int[]{1,2,3,4,5}; 这是一个二维数组,里面的每一个元素,都是一个一维数组 ...