strace常用来跟踪进程执行时的系统调用和所接收的信号。 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。下面智游推送就为大家介绍linux运维中的strace命令

strace使用参数

-p 跟踪指定的进程

-f 跟踪由fork子进程系统调用

-F 尝试跟踪vfork子进程系统调吸入,与-f同时出现时, vfork不被跟踪

-o filename 默认strace将结果输出到stdout。通过-o可以将输出写入到filename文件中

-ff 常与-o选项一起使用,不同进程(子进程)产生的系统调用输出到filename.PID文件

-r 打印每一个系统调用的相对时间

-t 在输出中的每一行前加上时间信息。 -tt 时间确定到微秒级。还可以使用-ttt打印相对时间

-v 输出所有系统调用。默认情况下,一些频繁调用的系统调用不会输出

-s 指定每一行输出字符串的长度,默认是32。文件名一直全部输出

-c 统计每种系统调用所执行的时间,调用次数,出错次数。

-e expr 输出过滤器,通过表达式,可以过滤出掉你不想要输出

基本上完整的用法是这样:

strace -o /tmp/output2.txt -T -tt -e trace=desc -s 12 -p 17129

(墙内:http://mikixiyou.iteye.com/blog/1489090)

使用到的参数如下:

1)strace -p pid  可以跟踪某个后台进程

2)strace -o filename 把跟踪结果输出到文件

3)strace -T 记录每个系统调用花费的时间,可以看看哪个系统调用时间长

4)strace -t (或者 -tt)记录每个系统调用发生是的时间(时分秒的格式)

5)strace -s 1024 显示系统调用参数时,对于字符串显示的长度, 默认是32,如果字符串参数很长,很多信息显示不出来。

6)strace -e trace=nanosleep 只记录相关的系统调用信息。

-e trace=network // 只记录和网络api相关的系统调用

-e trace=file // 只记录涉及到文件名的系统调用

-e trace=desc // 只记录涉及到文件句柄的系统调用

还有其他的包括process,ipc,signal等。

应用场景

MySQL执行语句列表

当发生个http请求的时候,很多时候希望得到这个http请求发生了多少次数据库SELECT操作,是否在同一个mysql connection连接里面完成。这里以访问本页为例子,通过strace来跟踪这些MySQL SELECT查询语句。

//-9514是mysqld的进程号,为了看到整条SQL语句,我们通过-s 1024希望输出更多内容

#strace -f -F -ff -o strace-mysqld -s 1024 -p 9514

#find . -name "strace-mysqld*" -type f -print |xargs grep -n "SELECT.*FROM wp_"

./strace-mysqld.19203:64:

read(19, "\3SELECT option_name, option_value FROM wp_options WHERE autoload = 'yes'", 72) = 72

./strace-mysqld.19203:165:

read(19, "\3SELECT * FROM wp_users WHERE user_login = 'admin'", 50) = 50

./strace-mysqld.19203:184:

read(19, "\3SELECT meta_key, meta_value FROM wp_usermeta WHERE user_id = 1", 63) = 63

./strace-mysqld.19203:295:

read(19, "\3SELECT option_value FROM wp_options WHERE option_name = 'rewrite_rules' LIMIT 1", 80) = 80

./strace-mysqld.19203:311:

read(19, "\3 SELECT   wp_posts.* FROM wp_posts  WHERE 1=1  AND wp_posts.ID = 501

AND wp_posts.post_type = 'post'  ORDER BY wp_posts.post_date DESC ", 136) = 136

在调试的时候,strace能帮助你追踪到一个程序所执行的系统调用。当你想知道程序和操作系统如何交互的时候,这是极其方便的,比如你想知道执行了哪些系统调用,并且以何种顺序执行。

这个简单而又强大的工具几乎在所有的Linux操作系统上可用,并且可被用来调试大量的程序。

命令用法

让我们看看strace命令如何追踪一个程序的执行情况。

最简单的形式,strace后面可以跟任何命令。它将列出许许多多的系统调用。一开始,我们并不能理解所有的输出,但是如果你正在寻找一些特殊的东西,那么你应该能从输出中发现它。

让我们来看看简单命令ls的系统调用跟踪情况。

raghu@raghu-Linoxide~$ strace ls

Stracing ls command

这是strace命令输出的前几行。其他输出被截去了。

Strace write system call (ls)

上面的输出部分展示了write系统调用,它把当前目录的列表输出到标准输出。

下面的图片展示了使用ls命令列出的目录内容(没有使用strace)。

raghu@raghu-Linoxide~$ ls

ls command output

选项1 寻找被程序读取的配置文件

Strace 的用法之一(除了调试某些问题以外)是你能找到被一个程序读取的配置文件。例如,

raghu@raghu-Linoxide~$ strace php2>&1|grep php.ini

Strace config file read by program

选项2 跟踪指定的系统调用

strace命令的-e选项仅仅被用来展示特定的系统调用(例如,open,write等等)

让我们跟踪一下cat命令的‘open’系统调用。

raghu@raghu-Linoxide~$ strace-e open cat dead.letter

Stracing specific system call (open here)

选项3 跟踪进程

strace不但能用在命令上,而且通过使用-p选项能用在运行的进程上。

raghu@raghu-Linoxide~$ sudo strace-p1846

Strace a process

选项4 strace的统计概要

它包括系统调用的概要,执行时间,错误等等。使用-c选项能够以一种整洁的方式展示:

raghu@raghu-Linoxide~$ strace-c ls

Strace summary display

选项5 保存输出结果

通过使用-o选项可以把strace命令的输出结果保存到一个文件中。

raghu@raghu-Linoxide~$ sudo strace-o process_strace-p3229

Strace a process

之所以以sudo来运行上面的命令,是为了防止用户ID与所查看进程的所有者ID不匹配的情况。

选项6 显示时间戳

使用-t选项,可以在每行的输出之前添加时间戳。

raghu@raghu-Linoxide~$ strace-t ls

Timestamp before each output line

选项7 更精细的时间戳

-tt选项可以展示微秒级别的时间戳。

raghu@raghu-Linoxide~$ strace-tt ls

Time - Microseconds

-ttt也可以向上面那样展示微秒级的时间戳,但是它并不是打印当前时间,而是显示自从epoch(译注:1970年1月1日00:00:00 UTC)以来的所经过的秒数。

raghu@raghu-Linoxide~$ strace-ttt ls

Seconds since epoch

选项8 相对时间

-r选项展示系统调用之间的相对时间戳。

raghu@raghu-Linoxide~$ strace-r ls

Relative Timestamp

strace跟踪java,linux运维利器—–strace命令相关推荐

  1. 【APP】Linux运维利器--Grep命令及正则表达式

    grep, egrep, fgrep grep: 根据模式搜索文本,并将符合模式的文本行显示出来. 总结内容: 1.grep常用参数 2.grep正则表达式元字符集(基本用法)及高级用法 3.与正则相 ...

  2. 97 条 Linux 运维工程师常用命令总结

    97 条 Linux 运维工程师常用命令总结 1.ls [选项] [目录名 | 列出相关目录下的所有目录和文件 -a 列出包括.a开头的隐藏文件的所有文件-A 通-a,但不列出"." ...

  3. linux运维排查常用命令(开发专享)

    cd: 进入到某个目录下 cd hikvision ll:详细展示该目录下有的文件 ll su 用户名:切换用户名 例子: su root 根据字符串在文件中查找信息:Grep –a –i 字符串 文 ...

  4. 【APP】取代top工具的Linux运维利器--htop

    htop是一款运行于Linux系统监控与进程管理软件,用于取代Linux/Unix下传统的top,htop用C语言编写,采用了ncurses库,因此使用有此功能需要安装ncurses. 与top相比有 ...

  5. Linux运维之top命令解析

    0 背景 在 linux 系统上开发的时候,经常要用到 top 命令来对进程以及资源进行监控,本文对该命令的输出以及使用方法做一个介绍. 1 输出解析 如下图所示为在我的系统中运行 top 指令后输出 ...

  6. Linux运维入门快捷命令设置说明大全

    文章目录 一.目录结构说明 二.重要目录数据信息说明 三.etc目录下重要的数据文件 四.usr目录下重要的数据文件 五.var目录下重要的数据文件 六.proc目录下重要的数据文件 七.系统优化相关 ...

  7. Linux运维之常见命令

    文件管理类命令 :cp : 复制cp SRC DEST如果DEST不存在,系统会自动创建文件或目录如果DEST存在 :如果SRC是一个文件 : 如果DEST是一个文件,会直接将SRC中的内容覆盖DES ...

  8. Linux运维:ulimit命令修改打开文件的句柄数

    文章目录 ulimit命令语法 参数说明: 查看本机设置的参数: ulimit修改打开文件的句柄数 场景 解释: 修改 1.修改file-max 2.修改ulimit的open file 注意事项 d ...

  9. 网易云课堂Linux运维在线班命令笔记

    #################################### ###在线班-命令记录 ############ #################################### 1 ...

最新文章

  1. SAP NetWeaver 业务运作面向服务平台 介绍
  2. python下载安装教程2.7-Python2.7.6下载
  3. Java基础篇:强制类型转换
  4. 用canvas整个打飞机游戏
  5. docker运行dubbo-admin
  6. flask nginx+uwsgi超时设置
  7. java.io.StreamCorruptedException: invalid stream header: 20200909
  8. php foeeach页面输出,PHP数组foreach遍历输出例子详解
  9. 4.9冰箱的温度c语言,话说夏天冰箱温度调到多少度为最佳?
  10. python输入日期求星期几_python如何获取星期几
  11. python中if语句中可用break_python的if循环语句
  12. 3.1 该如何编写程序界面
  13. 计算机故障小知识,计算机故障的一些小知识.doc
  14. STC89C52RC的P4口的应用问题
  15. 交互式SQL(Transact SQL,TSQL)
  16. 新人如何快速上手项目管理?
  17. 海尔电视android怎么设置,海尔电视怎么连接手机 海尔电视连接手机步骤
  18. mybatis一对多,多对一映射,collection和association标签的使用
  19. 利用橡胶拉力试验机测试橡胶拉伸性能需满足的几个要求
  20. Android 虚拟分区详解(二) 虚拟分区布局

热门文章

  1. ICCV2019 全部论文分类汇总(含目标检测 / 图像分割等,1008 更新中)
  2. Springboot 的 WebMvcConfigurerAdapter 过时
  3. Chrome 黑色设置Auto Dark Mode for Web Contents
  4. 计算机复数怎转换成极坐标,如何把复数转化为极坐标
  5. php 注销函数,在PHP中,可以使用()函数来注销Session会话。
  6. 模电实验合集丨实验一 常用元器件的认识及基本仪器的使用
  7. 商城APP开发功能需求解析
  8. Android游戏进赚钱时刻 年内现月收入过千万游戏
  9. OpenERP采购的两种不同情况
  10. elementUI datepicker 样式