【发布时间】:2019-04-14 11:08:06
【问题描述】:
所以我有一个简单的递归 c++ 程序,非常基础:
#include <iostream>
int fibonacciRec(int no) {
if (no == 0 || no == 1)
return no;
else
return fibonacciRec(no-1) + fibonacciRec(no-2);
}
int main(int argc, char** argv) {
int no = 42;
for (int i = 1; i <= no; i++) {
std::cout << fibonacciRec(i-1) << " ";
}
std::cout << std::endl;
return 0;
}
现在我想在这个程序上运行strace,显示所有的系统调用。基本上我想看到很多 mmap 等,但是一旦调用第一个循环,strace -f 就会停止跟随系统调用,只显示最后一个 write 调用。 strace -c 也给出了不太可能的数字,因为程序需要超过 4-6 秒的时间来计算:
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
60.47 0.000078 78 1 munmap
26.36 0.000034 11 3 brk
13.18 0.000017 3 6 fstat
0.00 0.000000 0 4 read
0.00 0.000000 0 1 write
0.00 0.000000 0 5 close
0.00 0.000000 0 14 mmap
0.00 0.000000 0 10 mprotect
0.00 0.000000 0 6 6 access
0.00 0.000000 0 1 execve
0.00 0.000000 0 1 arch_prctl
0.00 0.000000 0 5 openat
------ ----------- ----------- --------- --------- ----------------
100.00 0.000129 57 6 total
【问题讨论】:
-
strace -c输出仅显示 系统调用 中的时间,而不是程序其余部分的时间。如果您想要非系统调用的时间,那么也许使用 profiler? -
至于
strace -f的问题,如果你降低循环的限制(即no的值要小得多),那么strace -f的输出可能小到可以在里面发布问题本身。这样我们就更容易知道发生了什么。
标签: c++ linux system-calls strace