Linux调试工具:strace监控Linux进程系统调用

strace是一个基础的调试工具,类似windows系统的Procmon,用来监控进程的系统调用或信号产生的情况,通过跟踪系统调用定位Linux程序出现的问题,监控Linux进程在后台做了什么,大多数Linux系统中已经默认安装 。

Strace记录中每一行都是一条系统调用,开始是系统调用的函数名,括号内是参数,等号后面是该调用的返回值。

查看系统调用的详情:man 2 <系统调用名>

strace的常用参数示例:

strace wireshark //用strace启动进程运行命令,并监控程序运行

strace -f -o output.txt vim //跟踪vim及其子进程的运行,将输出信息写到文件output.txt,有一些编辑器(如vim)可以高亮显示strace的输出

sudo strace -p 5711 -o trace.txt //根据PID跟踪已经运行的进程,并输出到txt

过滤输出结果
strace -e open ls
strace -e trace=open,read ls /home

strace -t -e open ls /home //输出每个调用的时间,-tt微秒级的时间
strace -r ls //相对时间,可用于测试进程性能

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

strace参数详解

-p 跟踪指定的进程
-f 跟踪由fork调用所产生的子进程.
-F 尝试跟踪vfork调用.在-f时,vfork不被跟踪
-ff 常与-o选项一起使用,不同进程(子进程)的跟踪结果输出到对应的filename.PID文件

-o filename 将输出写入filename文件

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

-T 显示每一调用所耗的时间.
-r 打印每一个系统调用的相对时间
-t 在输出中的每一行前加上时间信息.
-tt 在输出中的每一行前加上时间信息,微秒级.
-ttt 微秒级输出,以秒了表示时间.

-v 输出所有系统调用。默认情况下,一些频繁的系统调用默认不会输出
-s 指定每一行输出字符串的长度,默认是32。文件名一直全部输出
-d 输出strace关于标准错误的调试信息

-u username 以username 的UID和GID执行被跟踪的命令.
-i 输出系统调用的入口指针.
-q 禁止输出关于脱离的消息.
-V 输出strace的版本信息.
-h 输出简要的帮助信息
-x 以十六进制形式输出非标准字符串.
-xx 所有字符串以十六进制形式输出.
-a column 设置返回值的输出位置.默认 为40.
-s strsize 指定输出的字符串的最大长度.默认为32.文件名一直全部输出.

-e expr 输出过滤器,通过表达式,可以过滤出掉不想要输出,格式如下:
[qualifier=][!]value1[,value2]…
qualifier只能是 trace,abbrev,verbose,raw,signal,read,write其中之一.value是用来限定的符号或数字.默认的 qualifier是 trace.感叹号是否定符号.例如-eopen等价于 -e trace=open,表示只跟踪open调用.而-etrace!=open表示跟踪除了open以外的其它调用.有两个特殊的符号 all 和 none. 注意有些shell使用!来执行历史记录里的命令,所以要使用\\.
-e trace=set 只跟踪指定的系统调用.例如:-e trace=open,close,rean,write表示只跟踪这四个系统调用.默认的为set=all.
-e trace=file 只跟踪有关文件操作的系统调用.
-e trace=process 只跟踪有关进程控制的系统调用.
-e trace=network 跟踪与网络有关的所有系统调用.
-e strace=signal 跟踪所有与系统信号有关的系统调用.
-e trace=ipc 跟踪所有与进程通讯有关的系统调用.
-e abbrev=set 设定strace输出的系统调用的结果集.-v 等与 abbrev=none.默认为abbrev=all.
-e raw=set 将指定的系统调用的参数以十六进制显示.
-e signal=set 指定跟踪的系统信号.默认为all.如 signal=!SIGIO(或者signal=!io),表示不跟踪SIGIO信号.
-e read=set 输出从指定文件中读出的数据.例如-e read=3,5
-e write=set 输出写入到指定文件中的数据.

Leave a Reply

电子邮件地址不会被公开。 必填项已用*标注