一 点睛
strace不仅能追踪系统调用,通过使用参数-c,它还能将进程的系统调用做一个统计分析并返回。
二 实战1
1 代码
#include <iostream>
using namespace std;
int main(){
int a;
cin>>a;
cout<<a<<endl;
return 0;
}
2 编译上面的代码,并用strace进行统计
[root@localhost charpter05]# strace -c ./test
88
88
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
53.00 0.000053 5 10 mprotect
16.00 0.000016 3 5 read
11.00 0.000011 1 18 mmap
10.00 0.000010 10 1 munmap
6.00 0.000006 1 7 fstat
4.00 0.000004 4 1 write
0.00 0.000000 0 5 open
0.00 0.000000 0 5 close
0.00 0.000000 0 1 brk
0.00 0.000000 0 1 1 access
0.00 0.000000 0 1 execve
0.00 0.000000 0 1 arch_prctl
------ ----------- ----------- --------- --------- ----------------
100.00 0.000100 56 1 total
3 分析
test程序一共调用了5次read,1次write函数,各个系统函数调用次数是多少,消耗了多少时间,这些信息都清晰可见。
三 实战2
1 代码
将实战1中cin和cout函数scanf和printf
#include<stdio.h>
int main(){
int a;
scanf("%d",&a);
printf("%d\n",a);
return 0;
}
2 编译上面的代码,并用strace进行统计
[root@localhost charpter05]# strace -c ./test
8
8
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
0.00 0.000000 0 5 read
0.00 0.000000 0 1 write
0.00 0.000000 0 5 open
0.00 0.000000 0 5 close
0.00 0.000000 0 7 fstat
0.00 0.000000 0 18 mmap
0.00 0.000000 0 10 mprotect
0.00 0.000000 0 1 munmap
0.00 0.000000 0 1 brk
0.00 0.000000 0 1 1 access
0.00 0.000000 0 1 execve
0.00 0.000000 0 1 arch_prctl
------ ----------- ----------- --------- --------- ----------------
100.00 0.000000 56 1 total
3 说明
用C++的cin输入cout输出和C的scanf输入和printf输出,用到的系统调用数量都是一样的。