自己的递归c ++程序上的strace -f将不起作用

时间:2018-11-11 15:17:20

标签: c++ linux system-calls strace

所以我有一个简单的递归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

1 个答案:

答案 0 :(得分:1)

运行fibonacciRec时不需要进行任何mmap或任何其他系统调用。

唯一可以分配的内存是递归调用的堆栈内存,有几种原因使您的内存没有出现在strace中:

  • 确实没有多少内存。最大递归深度约为42,并且只有1个局部变量,因此堆栈帧很小。递归期间分配的总堆栈可能少于1页。
  • 即使有很多内存,堆栈分配也只会增长,而不会缩小,因此您会看到它很快增长到最大值,然后呆在那里很长时间。不会是洪水。
  • 堆栈分配始终无法通过系统调用完成。要向内核请求更多堆栈,您所要做的就是假装您已经拥有了它。内核会捕获页面错误,注意到该错误地址位于您现有的堆栈附近,并分配更多地址。它是如此透明,甚至strace也看不到它。

fibonacciRec除了调用自身并返回值外,不执行任何操作,只能操作局部变量。没有系统调用。