strace 跟踪进程中的系统调用

简介

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

使用技巧

-t 显示时间
-tt 显示微妙级别时间
-o file 将输出保存到文件
-T 显示系统调用耗费时间
技巧: 加上2>&1后可跟后续如more等操作,不加是不可以的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1.寻找被程序读取的配置文件
strace -t php 2>&1|grep php.ini
2.跟踪指定的系统调用
strace -t -e open cat 1.txt
3.跟踪进程
strace -t -p 12345
4.strace统计概要
包括系统调用的概要、执行时间、错误等。使用-c能够以一种整洁的形式展现
strace -c ls
5.追踪并保存结果至文件
strace -t -o output.txt php 1.php 2>&1
6.同时追踪多个进程
strace -p 12345 -p 12346 -p 12347
7.追踪php-fpm
strace -f $(pidof php-fpm|sed 's/\(\w*\)/\-p \1/g')
8.完整的追踪一个进程的系统调用
strace -p xxx -T -tt -f -o xxx

在Mac OS下对应的是命令是dtruss

对于strace中的系统调用,比如文件、socket等的,都会有文件描述符,通常这时候会配合使用lsof -p 来查询文件描述符对应的具体值是什么

参考

[使用 Linux 的 strace 命令跟踪/调试程序的常用选项][4]
example
example2
linux系统调用列表
restart_syscall