分析函数调用关系?/p>
(call graph)
的几种方?/p>
绘制函数调用关系图对理解大型程序大有帮助?/p>
我想大家都有过一边读源码
(并
在头脑中维护一个调用栈?/p>
?/p>
一边在纸上画函数调用关系,
然后整理成图的经历?/p>
如果运气好一点,借助调试器的单步跟踪功能?/p>
call stack
窗口,能节约一?/p>
脑力?/p>
不过如果要分析的是脚本语言的代码,
那多半只好老老实实用第一种方?/p>
了?/p>
如果在读代码之前?/p>
手边就有一份调用图?/p>
岂不妙哉?下面举出我知道的几
种免费的分析
C/C++
函数调用关系的工具?/p>
函数调用关系图(
call graph
)是图(
graph
),而且是有向图,多半还是无?/p>
图(无圈图)——如果代码中没有直接或间接的递归的话?/p>
Graphviz
是专门绘
制有向图和无向图的工具,所以很?/p>
call graph
分析工具都以它为后端
(back
end)
。那么前端呢?就看各家各显神通了?/p>
调用图的分析分析大致可分为“静态”和“动态”两种,所谓静态分析是指在?/p>
运行待分析的程序的前提下进行分析?/p>
那么动态分析自然就是记录程序实际运?/p>
时的函数调用情况了?/p>
静态分?/p>
又有两种方法,一是分析源码,二是分析编译后的目标文件?/p>
分析源码获得的调用图的质量取决于分析工具对编程语言的理解程度,
比如能不
能找出正确的
C++
重载函数?/p>
Doxygen
是源码文档化工具,也能绘制调用图,它
似乎是自己分析源码获得函数调用关系的?/p>
GNU
cflow
也是类似的工具,不过?/p>
似乎偏重分析流程图(
flowchart
)?/p>
对编程语言的理解程度最好的当然是编译器了,所以有人想出给编译器打补丁?/p>
让它在编译时顺便记录函数调用关系?/p>
CodeViz
(其灵感来自
Martin Devera
(Devik)
的工?/p>
)就属于此类,它?/p>
1.0.9
版)?/p>
GCC
3.4.1
打了个补丁。另?/p>
一个工?/p>
egypt
的思路更巧妙,
不用大动干戈地给编译器打补丁?/p>
而是让编译器
自己
dump
出调用关系,
然后分析分析?/p>
交给
Graphviz
去绘图?/p>
不过也有人另?/p>
炉灶,自己写?/p>
C
语言编译器(
ncc
),专门分析调用图,勇气可嘉。不如要?/p>
?/p>
C++
语言也这么干,成本不免太高了。分?/p>
C++
的调用图,还是借助编译器比
较实在?/p>
分析目标文件听起来挺高深?/p>
其实不然?/p>
反汇编的工作交给
binutils
?/p>
objdump
去做?/p>
只要分析一下反汇编出来的文本文件就行了?/p>
下面?/p>
Cygwin
?/p>
objdump
-d
a.exe
的部分结果:
00401050 <_main>:
401050:
55
p