功能
在linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通过系统调用访问硬件设备。
strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。
option参数
-c 统计每一系统调用的所执行的时间,次数和出错的次数等
-d 输出strace关于标准错误的调试信息
-f 跟踪由fork调用所产生的子进程
-tt 在输出中的每一行前加上时间信息,微秒级, 时间格式:17:22:58.345879
-p pid 跟踪指定的进程pid
以上命令一般都是与-p联用
读者可以使用man strace或者strace -help查看完整的参数列表。
strace使用
strace的使用一般在top命令之后,top命令是用来查看占用cpu异常的进程的。读者可以参考微服务定位——top。
找到异常的进程后,使用命令:top -Hp pid[进程id]进入进程,找到执行异常的那个线程。使用命令:strace -p nid[线程id] -T来查看底层的调用情况。
在此贴出网上的一些参考链接
strace实例
strace实例2
样例贴图
笔者在此贴出strace命令显示的底层执行的信息:
1
2
3
4
5
6
7
8
9
10
11$strace cat /dev/null
execve("/bin/cat", ["cat", "/dev/null"], [/* 22 vars */]) = 0
brk(0) = 0xab1000
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f29379a7000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
...
每一行都是一条系统调用,等号左边是系统调用的函数名及其参数,右边是该调用的返回值。
strace 显示这些调用的参数并返回符号形式的值。
strace 从内核接收信息,而且不需要以任何特殊的方式来构建内核。