c++ - 生成运行时递归调用树的工具

标签 c++ c algorithm

是否有一个简单的工具可以为递归算法生成运行时调用树?比如下面这个计算斐波那契数列的例子:

call tree for computing Fibonacci number

更具体地说,如果算法是用 C/C++ 实现的呢?

编辑:我想要这棵树来分析递归算法的复杂性。我知道如何生成手头的树。以前我只是在源文件中添加一些“cout”并生成一个点文件并使用graphviz生成树。但我想知道是否有一些好的工具可以节省我编写代码的时间。

编辑:斐波那契数列的示例代码是

//fib.cpp
#include<iostream>
typedef int Int;

Int fib(Int n)
{
  if (n==0)
    return 1;
  else if (n==1)
    return 1;
  else
    return fib(n-2)+fib(n-1);
}

int main()
{
  std::cout<<fib(5)<<std::endl;
  return 0;
}

我已经为这个简单的代码尝试了 valgrind,但找不到如何获取图形。我使用的命令如下:

g++ fib.cpp
valgrind --tool=callgrind ./a.out
kcachegrind callgrind.out.4343

我是错过了一些选项还是什么?

最佳答案

使用 callgrind (cmdline) 然后使用 kcachegrind (gui) 可视化调用树。它是“valgrind”套件中的工具之一。

Callgrind 是一个分析工具,它还允许您查看完整的调用树。您通过在您的程序上运行它来收集分析信息,然后您使用 kcachegrind 分析 callgrind 信息的输出。

附加编辑:不幸的是,正如我刚刚发现的那样,这仅部分适用于递归调用,在这种情况下,递归调用看起来像一个多次调用自身的 stub 。尽管 callgrind 将执行动态调用图,但它在显示传递值和返回值时失败了。静态调用图工具将具有相同的输出(没有调用次数)。

这看起来像这样,而不是你想要的:

enter image description here

我想找出递归函数调用的顺序、参数和返回值的唯一方法是执行回溯(gdb 或 backtrace() 函数)并可视化输出(通过 graphviz)。有一些工具可以做到这一点,但据我所知不是免费提供/开源的。

关于c++ - 生成运行时递归调用树的工具,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5180808/

相关文章:

c++ - 如何在 Windows7-64 位中为 RHEL 6 创建 C++ 应用程序

c# - 如何删除Windows Mobile的SIP按钮

c - 在 main.c 中定义其他头文件所需的宏的传统方法是什么?

python - 如何使用 Python 按比例分配日期

regex - 匹配关于同一主题的句子的算法

arrays - 将循环缓冲区移位/对齐/旋转到原地零

C++ 模板和运算符重载

c++ - 为什么这个未使用的变量没有被优化掉?

c - 使用 calloc 将内存分配给 Struct 变量时出现段错误

c - 如何在程序方法中获得一致的变量值?