分析函数调用关系å›?/p>
(call graph)
的几种方æ³?/p>
绘制函数调用关系图对理解大型程序大有帮助。我想大家都有过一边读源码(并在头
脑中维护一个调用栈ï¼?/p>
,一边在纸上画函数调用关系,
然后整理成图的经历。如果运气好一
点,借助调试器的单步跟踪功能å’?/p>
call stack
窗口,能节约一些脑力。不过如果要分析çš?/p>
是脚本语言的代码,那多半只好老老实实用第一种方法了。如果在读代码之前,手边就有
一份调用图,岂不妙哉?下面举出我知道的几种免费的分æž?/p>
C/C++
函数调用关系的工具ã€?/p>
函数调用关系图(
call graph
)是图(
graph
ï¼?/p>
,而且是有向图,多半还是无环图(无
圈图ï¼?/p>
——如果代码中没有直接或间接的递归的话ã€?/p>
Graphviz
是专门绘制有向图和无向图
的工具,所以很å¤?/p>
call graph
分析工具都以它为后端
(back end)
。那么前端呢?就看各å®?/p>
各显神通了ã€?/p>
调用图的分析分析大致可分为“静态”和“动态”两种,所谓静态分析是指在不运è¡?/p>
待分析的程序的前提下进行分析,那么动态分析自然就是记录程序实际运行时的函数调ç”?/p>
情况了ã€?/p>
静态分析又有两种方法,一是分析源码,二是分析编译后的目标文件ã€?/p>
分析源码获得的调用图的质量取决于分析工具对编程语言的理解程度,比如能不能找
出正确的
C++
重载函数ã€?/p>
Doxygen
是源码文档化工具,也能绘制调用图,它似乎是自å·?/p>
分析源码获得函数调用关系的ã€?/p>
GNU cflow
也是类似的工具,不过它似乎偏重分析流程图
ï¼?/p>
flowchart
ï¼?/p>
�/p>
对编程语言的理解程度最好的当然是编译器了,所以有人想出给编译器打补丁,让å®?