用Graphviz CodeViz可视化函数调用

本文详细介绍了CodeViz的安装过程,包括安装GraphViz、GCC和CodeViz的步骤,并通过实例展示了如何使用CodeViz分析C/C++源代码中的函数调用关系,提供了从编译阶段到调用图生成的全过程指导。

http://blog.chinaunix.net/u3/119403/showart_2347423.html安装1.安装GraphViz

调用图的天生依靠于GraphViz,所以首先要安装GraphViz。可以下载源码包编译、安装。

我在这偷点懒:tbag@:~$sudoapt-getinstallgraphviz

2.简单安装CodeViz

下载CodeVize源码包:http://www.csn.ul.ie/~mel/projects/codeviz/codeviz-1.0.11.tar.gz

解压:tbag@:~/down$tarxvfcodeviz-1.0.11.tar.gz

tbag@:~/down$cdcodeviz-1.0.11/

CodeViz使用了一个patch版本的GCC编译器,而且不同的CodeViz版本使用的

GCC版本也不同,可以下载CodeViz的源码包后查看Makefile文件来确定要使用的GCC版

本,codeviz-1.0.11使用GCC-3.4.6。实际上安装CodeViz时安装脚本会自动下载对应的GCC

并打patch,但是这里我们是分步安装,还是清楚一点好,先安装gcc再回来安装CodeViz。

3.安装GCC

下载gcc-3.4.6.tar.gz到cdcodeviz-1.0.11目录下的compilers里。

下载地址:ftp://ftp.mirrorservice.org/site...cc/releases/gcc-3.4

.6/gcc-3.4.6.tar.gz

CodeViz的安装脚本compilers/install_gcc-3.4.6.sh会自动检测compilers目录下

是否有gcc的源码包,若是没有则自动下载并打patch,这里前面已经下载,直接移到该

目录即可,则剩下的就是解压安装了。install_gcc-3.4.6.sh会解压缩gcc,打patch,并将

其安装到指定目录,若是没有指定目录,则缺省使用$HOME/gcc-graph,通常指定/usr/

local/gcc-graph(这时需要root权限)。

tbag@:~/down/codeviz-1.0.11$cdcompilers/

tbag@:~/down/codeviz-1.0.11/compilers$ls

gcc-3.4.6.tar.gzgcc-graphgcc-patchesinstall_gcc-3.4.6.sh

tbag@:~/down/codeviz-1.0.11/compilers$./install_gcc-3.4.6.sh

接下来就可以往喝杯咖啡了。。。。。

安装CodeViz

tbag@:~/down/codeviz-1.0.11$./configure

tbag@:~/down/codeviz-1.0.11$make

#make(这里不需要是由于在脚本中不会检测是否已经make了gcc-3.4.6,前

面已经作过了,所以只要安装codeviz即可。编译的目标只是gcc-3.4.6,codeviz不需要编

译。具体查看Makefile文件)

tbag@:~/down/codeviz-1.0.11$makeinstall-codeviz

(前面已经安装了gcc,所谓的安装codeviz只是将makeinstall-codeviz

脚本genfull和gengraph复制到/usr/local/bin目录下。codeviz需要perl库的支持,我

的系统上缺省安装了perl,所以没有出现什么题目。若是安装出现题目,则查看

configure和Makefile确定需要安装哪些库即可)

目前为止,CodeViz安装完成了,下面看一下它的使用吧。

4.使用

GraphViz支持天生不同风格的调用图,但是一些需要安装额外的支持工具或者库程序,

有爱好的朋友可以到http://www.graphviz.org上查找相关资料。这里重点讲述CodeViz的

使用方法,具体的图像风格控制不再详述。

CodeViz使用两个脚本来天生调用图,一个是genfull,该脚本可以天生项目的完整调

用图,因此调用图可能很大很复杂,缺省使用cdepn文件来创建调用图;另一个是

gengraph,该脚本可以对给定一组函数天生一个小的调用图,还可以天生对应的

postscript文件。安装时这两个脚本被复制到/usr/local/bin目录下,所以可以直接使用

而不需要指定路径。

5.编译

打了patch的gcc/g++为编译的每个C/C++文件天生.cdepn文件,该文件包含函数调

用信息、声明信息等等。

1)tbag@:~/test/jpeg$http://www.cnblogs.com/gcc-graph/bin/gcc*.c-otbag

2)tbag@:~/test/jpeg$genfull

3)tbag@:~/test/jpeg$gengraph-d2-output-type"png"-fjpeg_decompress2bmp

第一步,使用刚刚安装的gcc-3.4.6来编译当前目录下所有.c文件,gcc/g++为编译的每个C/C++文件天生.cdepn文件

第二步:使用此脚本会在当前目录天生一个full.graph文件,该脚本可以天生项目的完整调

用图信息文件,因此调用图信息文件可能很大很复杂,缺省使用cdepn文件来创建调用图信息文件;

第三步:该脚本可以对给定一组函数天生一个小的调用图,‘-d2’参数是只显示两层调用关系,‘-output-type"png"’指定输出格式为png,‘-fjpeg_decompress2bmp’指定从哪个函数开始天生调用关系图。

http://blog.youkuaiyun.com/Solstice/archive/2005/09/22/486788.aspx

CodeViz是《UnderstandingTheLinuxVirtualMemoryManager》(atAmazon,下载地址在页尾)的作者MelGorman写的一款分析C/C++源代码中函数调用关系的opensource工具(类似的opensource软件有egypt、ncc)。其基本原理是给GCC打个补丁,让它在编译时每个源文件时dump出其中函数的callgraph,然后用Perl脚本收集并整理调用关系,转交给Graphviz绘制图形。CodeViz原本是作者用来分析Linuxvirtualmemory的源码时写的一个小工具,现在已经基本支持C++语言,最新的1.0.9版能在Windows+Cygwin下顺利地编译使用:)。需要留意的是:1)下载GCC3.4.1的源码gcc-3.4.1.tar.gz放到codeviz-1.0.9/compilers,2)安装patch程序(属于Utils类),3)从http://www.graphviz.org下载并安装Graphviz2.6。

我用CodeViz分析《嵌进式实时操纵系统uC/OS-II(第二版)》中的第一个范例程序,步骤如下:

1.想办法让gcc能编译uC/OS2.52和范例程序的源码,每个C源文件天生对于的.c.cdepn文件。只要编译(参数-c)就行,无需连接。

2.调用genfull天生full.graph,这个文件记录了所有函数在源码中的位置和它们之间的调用关系。

3.使用gengraph天生我关心的函数的调用关系。

1.gengraph--output-typegif-fmain

分析main()的callgraph,得到的图如下,看不出要领:

2.gengraph--output-typegif-fmain-sOSInit

暂时不关心OSInit()的内部实现细节(参数-s),让它显示为一个节点。得到的图如下,有点乱,不过好多了:

3.gengraph--output-typegif-fmain-sOSInit-i"OSCPUSaveSR;OSCPURestoreSR"

基本上每个函数都会有进进/退出临界区的代码,忽略之(参数-i)。得到的图如下,基本清楚了:

4.gengraph--output-typegif-fmain-s"OSInit;OSSemCreate"-i"OSCPUSaveSR;OSCPURestoreSR"-k

OSSemCreate()的内部细节似乎也不用关心,不过保存中间文件sub.graph(参数-k),得到的图如下,

5.dot-Tgif-omain.gifsub.graph

修改sub.graph,使图形符合函数调用顺序,最后得到的图如下,有了这个都不用看代码了:)

看看哪些函数调用了OSTimeDly(),参数-r,Task()和TaskStart()都是用户编写的函数:

在分析源码的时候,把这些图形打印在手边,在上面做笔记,实在方便得很。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值