获取graphics函数调用图的代码工具
我有一个很大的工作空间,有很多C代码的源文件。 虽然我可以在MS VS2005中使用对象浏览器查看函数调用的函数,而在MSVC 6.0中,也只能显示在非graphicstypes的显示中从特定函数调用的函数。 此外,它不显示从main()
开始的函数,然后从它调用的函数等等,在叶级函数内部更深。
我需要一个工具,它会给我一个函数调用图,函数callee
和caller
通过箭头或类似的方式连接,从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是最强大和最复杂的工具,恕我直言。