Strace

Strace是Linux环境下用于调试诊断应用程序调用systemcall的工具。

由于Strace只检测系统调用,因此Strace只是一个分析的侧面。
例如:命令perl -e 'while(1){}'不会产生任何系统调用

系统调用包括以下几个方面file, process, network, signal, ipc, desc, 默认将检测所有系统调用即all

使用Strace统计运行期间系统调用占比

1
2
3
4
5
6
7
8
9
10
11
12
13
$ sudo strace -f -c main
strace: Process 30879 detached
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
64.79 2.184606 35236 62 3 futex
28.13 0.948503 566 1675 1 clock_nanosleep
2.85 0.096019 8 12105 getsockopt
1.35 0.045417 3 16768 mprotect
0.82 0.027561 7 4002 3633 recvfrom
0.65 0.021963 3 7108 lseek
...
------ ----------- ----------- --------- --------- ----------------
100.00 3.371847 55680 5957 total

使用Strace 记录程序运行期间的系统调用

可以通过添加-tt记录调用时间戳,与程序日志对比可区分出程序各个阶段的系统调用

1
2
3
4
5
6
7
8
9
10
11
$ sudo strace -f -tt -T -o /tmp/test/trace.log main

$ cat /tmp/test/trace.log
18721 21:02:31.936942 execve("/bin/bash", ["bash", "-c", "APOWO_SERVER_ROOT=/home/never/wo"...], 0x7ffef5c46408 /* 14 vars */) = 0 <0.000077>
18721 21:02:31.937082 brk(NULL) = 0x563070e9c000 <0.000017>
18721 21:02:31.937133 arch_prctl(0x3001 /* ARCH_??? */, 0x7ffe20222180) = -1 EINVAL (Invalid argument) <0.000017>
18721 21:02:31.937183 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) <0.000019>


PID 调用时间 系统调用名称 返回 消耗时间
18721 21:02:31.936942 execve("/bin/bash", ["bash", "-c", "APOWO_SERVER_ROOT=/home/never/wo"...], 0x7ffef5c46408 /* 14 vars */) = 0 <0.000077>

参考

https://linux.die.net/man/1/strace

Author

Nevermore

Posted on

2022-01-07

Updated on

2024-02-21

Licensed under