Linux进程追踪者之"strace"

时间:2024-03-19 10:17:36

strace 被用来追踪某一条进程的访问路径,在执行过错中调用的函数等等
对研究单个进程的执行过程很有帮助。

strace 命令:
strace 【strace参数】 【追踪对象】

strace参数:
首先,简单说说它的使用参数,Strace的参数包括输出参数、过滤参数、统计参数、跟踪参数、启动参数和其他杂项。详细的看帮助文档或者搜索它的用法,我们只简单介绍几个常用的参数:
-p Pid 跟踪指定的进程号的进程。
-o 文件 输出追踪信息到文件。
-f 跟踪由fork调用所产生的子进程。
-e expr 表达式,用指定追踪的方法,常见有:
-e trace=open,close,rean,write 跟踪这四个系统函数的调用,默认的为set=all。
-e trace=file 跟踪有关文件操作的系统调用。
-e trace=process 跟踪进程调用。
-e strace=signal 跟踪所系统信号调用。

-d 输出debug信息到标准错误输出。
-c 统计功能,统计系统调用次数,时间和出错次数等信息。
-t/r 输出调用的绝对/相对时间戳。
-u 用户名 追踪特定用户的进程。

下面是相关实践:

用法一:追踪脚本或进程的执行情况

追踪脚本的运行调用的函数与执行情况,可以用strace 【执行语句】,或者在进程运行时,strace -p PID:
Linux进程追踪者之"strace"
每一行都是一条系统调用,等号左边是系统调用的函数名及其参数,右边是该调用的返回值。
strace 显示这些调用的参数并返回符号形式的值。strace 从内核接收信息,而且不需要以任何特殊的方式来构建内核。
追踪一个进程:
Linux进程追踪者之"strace"这种用法同样可以用来调试程序(比如XX服务启动失败,执行失败)
strace -f -F -o ~/XXX-strace.txt ./start demosvr.sh
追踪fork与vfork进程,并将启动demosvr.sh的信息 写入strace.txt

strace -o output.txt -T -tt -e trace=all -p 55606
跟踪55606进程的所有系统调用(-e trace=all),并统计系统调用的花费时间,以及开始时间(并以可视化的时分秒格式显示),最后将记录结果存在output.txt文件里面

用法二:查找运行的服务调用的文件

使用strace -tf 查找进程运行时是否读过某个文件,需要结合管道grep等使用,进行筛选:
注意:starce输出结果是输出到标准错误2的,当做debug信息了。而|管道传递给grep的只是标准输出1 ,若不加转换则grep 筛选 不起作用(标准输出为空)。所以必须要加上“2>&1”,要把标准错误的信息先重定向到标准输出1。否则会全部输出Linux进程追踪者之"strace"
通过strace也可以查看某个进程或服务的性能详细:使用strace -c 即可统计一段时间内的进程性能包括系统调用、耗时、和错误次数:
time:时间占比
seconds:用时(秒)
users/call:每个系统调用平均耗时(微秒)
calls:总的调用次数
error:错误数
syscall:系统调用的类型
Linux进程追踪者之"strace"

用法三:查找消耗资源的子进程

先使用top命令找出cpu使用过大的子进程,再使用strace追踪子进程,查看为什么使用过高
Linux进程追踪者之"strace"
追踪这个进程 strace -tf -p 909
Linux进程追踪者之"strace"
信息显示了进程调用系统函数的情况,具体函数参考这里