获取graphics函数调用图的代码工具

我有一个很大的工作空间,有很多C代码的源文件。 虽然我可以在MS VS2005中使用对象浏览器查看函数调用的函数,而在MSVC 6.0中,也只能显示在非graphicstypes的显示中从特定函数调用的函数。 此外,它不显示从main()开始的函数,然后从它调用的函数等等,在叶级函数内部更深。

我需要一个工具,它会给我一个函数调用图,函数calleecaller通过箭头或类似的方式连接,从main()函数开始到函数的最后一级,或者至less显示一个函数调用图C源文件。 如果我能打印这张图,那将是非常棒的。

任何好的工具来做到这一点(不必是免费的工具)?

  • 埃及 (自由软件)

  • NCC

  • KcacheGrind (GPL)

  • Graphviz (CPL)

  • CodeViz (GPL)

doxygen (与graphviz结合)可以生成调用图。

KcacheGrind

https://kcachegrind.github.io/html/Home.html

用法:

 sudo apt-get install -y kcachegrind valgrind gcc main.c valgrind --tool=callgrind ./a.out # Generates a callgrind.out.<PID> file. kcachegrind callgrind.out.1234 # Opens a GUI to visualize callgrind data. 

在hello世界程序中导出的示例graphics图像:

这种方法的好处是你不需要源代码来查看调用图,只需要可执行文件。

它执行程序,并logging每当一个函数被调用时,所谓的dynamic分析,相比之下静态分析源代码,而不运行它。

这个问题的非图片版本: 在Linux中跟踪本地函数调用的工具 cflow是一个非常简单的选项。

gcc -finstrument-functions + etrace

https://github.com/elcritch/etrace

-finstrument-functions 添加callback -finstrument-functions ,etrace对ELF文件进行处理并实现所有的callback-finstrument-functions

我不能工作,但不幸的是: 为什么`-finstrument-functions`为我工作?

声明的输出格式为:

 \-- main | \-- Crumble_make_apple_crumble | | \-- Crumble_buy_stuff | | | \-- Crumble_buy | | | \-- Crumble_buy | | | \-- Crumble_buy | | | \-- Crumble_buy | | | \-- Crumble_buy | | \-- Crumble_prepare_apples | | | \-- Crumble_skin_and_dice | | \-- Crumble_mix | | \-- Crumble_finalize | | | \-- Crumble_put | | | \-- Crumble_put | | \-- Crumble_cook | | | \-- Crumble_put | | | \-- Crumble_bake 

除了没有特定的硬件跟踪支持外,可能还有最有效的方法,但是不利的是你必须重新编译代码。

了解创build通话图表做得非常好。

你可以试试CScope + tceetree + Graphviz 。

我们的DMS Software Reengineering Toolkit具有静态控制/数据stream/点对/呼叫图分析function ,已应用于庞大系统(〜2500万行)的C代码,并生成了这样的调用图, 包括通过函数指针调用的函数

你可以在这里查看我的基于bash的C调用树生成器。 它可以让你指定一个或多个C函数,你想要调用者和/或被调用的信息,或者你可以指定一组函数,并确定连接他们的函数调用的可达性图…即告诉我所有的方式main( ),foo()和bar()被连接。 它使用graphviz / dot作为graphics引擎。

在这里, Astrée是最强大和最复杂的工具,恕我直言。