一,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. Java并发编程之闭锁与栅栏

    一.前言 闭锁与栅栏是在多线程编程中的概念,因为在多线程中,我们不能控制线程的执行状态,所以给线程加锁,让其按照我们的想法有秩序的执行. 闭锁 CountDownLatch,实例化时需要传入一个int ...

  2. oracle之二redo日志

    redo 日志 4.1 redo (重做) log 的功能:数据recovery4.2 redo log 特征:     1)记录数据库的变化(DML.DDL)     2)用于数据块的recover ...

  3. redis.conf讲解

    转自https://www.cnblogs.com/zhang-ke/p/5981108.html #redis.conf # Redis configuration file example. # ...

  4. netty之decoder

    转载自:https://blog.csdn.net/jzft_nuosu/article/details/80341018 netty的handler和decoder中的channelRead和dec ...

  5. hystrix源码小贴士之中断

    execution.isolation.thread.interruptOnCancel可以设置当cancellation发生时是否需要中断.通过Future的cancel方法和线程的中断方法来实现是 ...

  6. Flutter继承环信IM-发送视频时失败:No value for fileLength

    首先贴一下代码: 这是发送视频消息的方法 报出一下错误信息: 这是由于在解析的时候JSON里面没有fileLength这个值 往回看发送视频消息api,也并不需要fileLength参数 那顺着错误信 ...

  7. (一)jenkins+git+docker

    目录 一.发布流程设计 1.工作流程 2.环境规划如下 二.部署Git仓库 1.创建Git用户并设置密码 2.创建仓库 3.免密访问 4.在jenkins那台机上做ssh认证 三.准备Jenkins环 ...

  8. zookeeper watch笔记

    ZK其核心原理满足CP, 实现的是最终一致性, 它只保证顺序一致性. zookeeper 基于 zxid 以及阻塞队列的方式来实现请求的顺序一致性.如果一个client连接到一个最新的 followe ...

  9. Object.defineProperty和proxy

    Object.defineProperty问题 Object.defineProperty() 无法监控到数组下标的变化.vue只能通过以下几种方法来监听 pop() shift() unshift( ...

  10. Apache CXF基本使用

    一.服务端开发 1.创建web项目 2.导入jar包 3.web.xml中配置Servlet 1 <!-- 配置CXF框架提供的Servlet --> 2 <servlet> ...