linux动态追踪神器——Strace实例介绍【转】
Strace是Linux下一款通用的进程动态跟踪工具,用来追踪程序执行时的系统调用和所接收的信号。其应用方法如下图(部分)。
首先,简单说说它的使用参数,Strace的参数包括输出参数、过滤参数、统计参数、跟踪参数、启动参数和其他杂项。详细的看帮助文档或者搜索它的用法,我们只简单介绍几个常用的参数:
-p Pid 跟踪指定的进程号的进程。
-o 文件 输出追踪信息到文件。
-f 跟踪由fork调用所产生的子进程。
-e expr 表达式,用指定追踪的方法,常见有:
-e trace=open,close,rean,write 跟踪这四个系统函数的调用,默认的为set=all。
-e trace=file 跟踪有关文件操作的系统调用。
-e trace=process 跟踪进程调用。
-e trace=network 跟踪网络调用。
-e strace=signal 跟踪所系统信号调用。
-e trace=ipc 跟踪ipc通讯调用。
其他更多筛选公式略。。。
-d 输出debug信息到标准错误输出。
-c 统计功能,统计系统调用次数,时间和出错次数等信息。
-t/r 输出调用的绝对/相对时间戳。
-u 用户名 追踪特定用户的进程。
1、查找实际加载的配置文件
常有人会问我,为什么我的配置改了,实际沒生效。我问他你改完重启了么,哦,忘了。过了一会又来问,哥我重启了,还是一样没效果。我问你改的那个文件?他说,找网上百度的,不知道为啥不生效。
这个场景估计很多人都遇到过,那对付这类问题有没有啥好的、一劳永逸的办法,还是只凭经验或者频繁的问人老司机呢?
其实最好的一个方法,就是用strace追踪下进程加载的文件,这里面的加载的配置文件肯定就是真正使用的配置文件,修改这个文件,重启就肯定生效了。
举例,我们要找mysql的配置文件
strace -tf mysql 2>&1|grep cnf
结果如上图,我们看出来了,实际的调用文件是/etc/my.cnf。
至于命令中的“2>&1” ,有认真的同学会有疑问,去掉可以么?然后去试了,结果grep没起作用,所有内容一股脑全出来了。为什么如此呢?原来starce输出结果是输出到标准错误2的,当做debug信息了。而|管道传递给grep的只是标准输出1 ,所以内容全部显示了(标准错误),而grep 筛选没起作用(标准输出为空)。所以必须要加上“2>&1”,要把标准错误的信息先重定向到标准输出1。这样结果才对。
同样的方法,适用于查找配置文件,加载类库文件找不到等等。举一反三尝试好了。
2、追踪耗时进程
如果你突然发现你的程序启动很慢,或者占用cpu,内存等特别大;或者你发现系统负载很大,你通过top,ps等发现是某个进程导致,比如msyql程序;再者可能服务器被黑了,有个木马进程占了很大资源。我们想进一步细化分析,究竟为啥mysql占的资源特别大?这个木马进程都干了什么坏事?这时候祭出strace神器就ok了。
我们前面说了strace有统计参数,最简单就是-c参数,对一个进程加-c参数,strace会统计程序系统调用的统计。会统计那些项呢?我们上面介绍-c参数时候说了,有系统调用、耗时、和错误次数。
统计mysql的调用如下图:
看出来系统调用主要是调用nmap,这是和内存有关的。可以明确mysql主要在做内存操作。
我们再通过Pid动态跟踪下,执行-c -p Pid 一段时间,ctrl+c退出,就有结果:
可见大部分时间在做pull调用。
3、综合追踪java耗时、内存泄露,debug错误等
1)首先查找最好资源的子进程:
top -H -p `ps aux|perl -lane 'print $F[1] if $F[0]=~/tomcat/'
2)用trace追踪最耗时子进程
strace -p 31164
发现是futex进程同步线程时候,有大量链接超时。
3)结合jstack 追踪代码级别的问题
此子进程转化为16进制,然后用jstack 分析,并搜索这个子进程的16进制,得到具体VM的具体debug信息,从而进一步做代码排查。
好了,其实 strace有更多的扩展应用,网上有很多文章介绍可供学习参考。当然你可以根据自己实际的环境进一步深挖,发现更大的宝藏。
jstack使用方法参考
tomcat+java的web程序持续占cpu高问题调试【转】 - paul_hch - 博客园 http://www.cnblogs.com/paul8339/p/7144736.html
Java线上应用故障排查之一:高CPU占用【转】 - paul_hch - 博客园 http://www.cnblogs.com/paul8339/p/7464206.html
Java线上应用故障之CPU占用高排查与定位 - paul_hch - 博客园 http://www.cnblogs.com/paul8339/p/7591226.html
转自
「安全工具」linux动态追踪神器——Strace实例介绍 https://www.toutiao.com/i6521168589418922504/
linux动态追踪神器——Strace实例介绍【转】的更多相关文章
- tcpdump wireshark 实用过滤表达式(针对ip、协议、端口、长度和内容) 实例介绍
tcpdump wireshark 实用过滤表达式(针对ip.协议.端口.长度和内容) 实例介绍 标签: 网络tcpdst工具windowslinux 2012-05-15 18:12 3777人阅读 ...
- [转] - Linux网络编程 -- 网络知识介绍
(一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端 网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...
- Linux神器之Strace的实践(Ubuntu上服务幽灵般的消失)
不论是运维,还是开发,面对Linux系统,时常会因为配置参数或者系统的权限(iptables限制端口,selinux拦截,文件目录权限等)原因出现程序或者服务异常,无法启动等等.特别是在Linux的文 ...
- linux下mysql多实例安装
1.MySQL多实例介绍 1.1.什么是MySQL多实例 MySQL多实例就是在一台机器上开启多个不同的服务端口(如:3306,3307),运行多个MySQL服务进程,通过不同的socket监听不同的 ...
- Linux 文件内容查看工具介绍-cat,less,more,tail,head
Linux 文件内容查看工具介绍 作者:北南南北来自:LinuxSir.Org摘要: 本文讲述几种常用文件内容的查看工具,比如cat.more.less.head.tail等,把这些工具最常用的参数. ...
- linux下mysql多实例安装(转)
转自:http://www.cnblogs.com/xuchenliang/p/6843990.html 1.MySQL多实例介绍 1.1.什么是MySQL多实例 MySQL多实例就是在一台机器上 ...
- Linux培训教程 linux中nl命令使用介绍
nl命令在linux系统中用来计算文件中行号.nl 可以将输出的文件内容自动的加上行号!其默认的结果与 cat -n 有点不太一样, nl 可以将行号做比较多的显示设计,包括位数与是否自动补齐 0 等 ...
- linux下top命令详细介绍
linux下top命令详细介绍 top 命令是 Linux 下常用的系统资源占用查看及性能分析工具,能够实时显示系统中各个进程的资源(比如cpu.内存的使用)占用状况,top命令的执行结果是一个动态显 ...
- linux常用命令与实例小全
转至:https://www.cnblogs.com/xieguohui/p/8296864.html linux常用命令与实例小全 阅读目录(Content) 引言 一.安装和登录 (一) ...
随机推荐
- Daily Scrum - 12/01
Meeting Minutes 今天重阳去和UI设计团队的人去讨论UI方面的事宜了,剩下的人主要还是在讨论文件输入输出的事.目前总算是能实现文件存取了,尽量在明天前把文件的格式内容都弄好. Burnd ...
- Smart Disk -- proposed by Liyuan Liu
Need 如今,照相渐渐得成为了人们的日常举动.几乎所有的人都在随时随地得照相.手机,相机,平板越来越多的设备对照相进行了支持,同时, 照片以一种前所未有的速度渐渐淹没我们的文件夹.而寻找照片,对照片 ...
- beta2
组员1:吴晓晖(组长) 过去两天完成了哪些任务 代码重构基本完成 展示GitHub当日代码/文档签入记录 接下来的计划 推荐算法 还剩下哪些任务 组员2:陈锦谋 过去两天完成了哪些任务 重新制作图标 ...
- 正则的replace函数传参使用
<script> var str = "a1ba2b"; var reg = /a.b/g; str = str.replace(reg,function(a,b){ ...
- webpack打包使用
md创建文件夹 dir是遍历 如何安装node环境 首先下载安装包;安装好以后 使用cmd命令 建立一个新的文件夹(一定是英文的),然后cmd 命令中 cd 进入所安装的盘的地址. 在该文件夹下面 使 ...
- jsonp 接口
一.请求接口 <script type="text/javascript" src="js/jquery.min.js"></script&g ...
- Java之序列化和反序列化
序列化的对象: package test_demo.SerializableOper; import java.io.Serializable; /* * 序列化对象需要实现序列号接口 * */ pu ...
- 【ARC082E】ConvexScore
Description 给定二维直角坐标系上的N个点\((X_i,Y_i)\),定义一个有N个点中的部分点所构成点集为"凸点集",当且仅当该集合内的所有点恰好构成一个面积为正的凸多 ...
- PHP使用serialize和json_encode序列化数据并通过redis缓存文件和$GLOGALS缓存资源对象
PHP常用缓存方式:第一种,把需要缓存的数据进行处理,形成PHP可以直接执行的文件.在需要缓存数据的时候,通过include方式引入,并使用.第二种,把需要的数据通过serialize函数序列化后直接 ...
- maven项目添加mysql的链接驱动
Maven项目中添加JDBC驱动 在pom.xml配置文件中添加: <dependency> <groupId>mysql</groupId> <arti ...