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实例介绍【转】的更多相关文章

  1. tcpdump wireshark 实用过滤表达式(针对ip、协议、端口、长度和内容) 实例介绍

    tcpdump wireshark 实用过滤表达式(针对ip.协议.端口.长度和内容) 实例介绍 标签: 网络tcpdst工具windowslinux 2012-05-15 18:12 3777人阅读 ...

  2. [转] - Linux网络编程 -- 网络知识介绍

    (一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端         网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...

  3. Linux神器之Strace的实践(Ubuntu上服务幽灵般的消失)

    不论是运维,还是开发,面对Linux系统,时常会因为配置参数或者系统的权限(iptables限制端口,selinux拦截,文件目录权限等)原因出现程序或者服务异常,无法启动等等.特别是在Linux的文 ...

  4. linux下mysql多实例安装

    1.MySQL多实例介绍 1.1.什么是MySQL多实例 MySQL多实例就是在一台机器上开启多个不同的服务端口(如:3306,3307),运行多个MySQL服务进程,通过不同的socket监听不同的 ...

  5. Linux 文件内容查看工具介绍-cat,less,more,tail,head

    Linux 文件内容查看工具介绍 作者:北南南北来自:LinuxSir.Org摘要: 本文讲述几种常用文件内容的查看工具,比如cat.more.less.head.tail等,把这些工具最常用的参数. ...

  6. linux下mysql多实例安装(转)

    转自:http://www.cnblogs.com/xuchenliang/p/6843990.html   1.MySQL多实例介绍 1.1.什么是MySQL多实例 MySQL多实例就是在一台机器上 ...

  7. Linux培训教程 linux中nl命令使用介绍

    nl命令在linux系统中用来计算文件中行号.nl 可以将输出的文件内容自动的加上行号!其默认的结果与 cat -n 有点不太一样, nl 可以将行号做比较多的显示设计,包括位数与是否自动补齐 0 等 ...

  8. linux下top命令详细介绍

    linux下top命令详细介绍 top 命令是 Linux 下常用的系统资源占用查看及性能分析工具,能够实时显示系统中各个进程的资源(比如cpu.内存的使用)占用状况,top命令的执行结果是一个动态显 ...

  9. linux常用命令与实例小全

    转至:https://www.cnblogs.com/xieguohui/p/8296864.html  linux常用命令与实例小全 阅读目录(Content) 引言 一.安装和登录 (一)    ...

随机推荐

  1. 第二个Sprint

    能够实现三个数,两个操作符的四则运算.

  2. NPM和Yarn添加淘宝镜像

    NPM设置淘宝镜像 1.查询当前配置的镜像 npm get registry > https://registry.npmjs.org/ 设置成淘宝镜像 npm config set regis ...

  3. Docker(七)-Dcoker常用命令

    容器生命周期管理 run start/stop/restart kill rm pause/unpause create exec 容器操作 ps inspect top attach events ...

  4. Installing OpenSSH from the Settings UI on Windows Server 2019 or Windows 10 1809

    Installing OpenSSH from the Settings UI on Windows Server 2019 or Windows 10 1809 OpenSSH client and ...

  5. Windows 下 Docker 的简单学习使用过程之一 dockertoolbox

    1. Windows 下面运行 Docker 的两个主要工具1): Docker for Windows2): DockerToolbox区别:Docker For Windows 可以理解为是新一代 ...

  6. robotframework+Selenium2Library 模态窗口的处理

    原文链接:https://www.cnblogs.com/zuola/p/5750018.html   所谓模态窗口,就是指除非采取有效的关闭手段,用户的鼠标焦点或者输入光标将一直停留在其上的对话框. ...

  7. Luogu1641 SCOI2010生成字符串(组合数学)

    NOI2018冒泡排序的一个子问题. #include<iostream> #include<cstdio> #include<cmath> #include< ...

  8. 今天GG

    刚开考: 这里锅了,那里锅了,还被D了QAQ. 然后\(YL\)说,\(T2\)不是傻逼题吗. 于是萝卜秒掉了\(T1\). 于是\(gsy\)秒掉了\(T3\). \(lalaxu,FlashHu\ ...

  9. oracle系统表v$session、v$sql字段说明

    在本视图中,每一个连接到数据库实例中的 session都拥有一条记录.包括用户 session及后台进程如 DBWR, LGWR, arcchiver等等. V$SESSION中的常用列 V$SESS ...

  10. idea中的pom文件中的jar包下载不了,手动下载jar包的方法

    问题描述: 在pom文件中添加依赖的时候,程序怎么着都是下载不了,而且实验了各种方式: IDEA引MAVEN项目jar包依赖导入问题解决 https://www.cnblogs.com/a845701 ...