Codeviz+Graphviz+gcc的安装及使用

CodeViz是《 Understanding The Linux Virtual Memory Manager 》( at Amazon 下载地址 在页尾)的作者  Mel Gorman  写的一款分析C/C++源代码中函数调用关系的open source工具(类似的open source软件有 egypt ncc )。 其基本原理是给 GCC 打个补丁,让它在编译时每个源文件时 dump 出其中函数的 call graph,然后用 Perl 脚本收集并整理调用关系,转交给Graphviz绘制图形。

安装前提:经笔者多次测试,发现在64位linux安装失败,在32位rhel 6.5下面安装成功

一、下载安装包
  1、 codeviz-1.0.12
            http://www.csn.ul.ie/ ~mel/projects/codeviz/
  2、 graphviz-2.38.0
  3、gcc-4.6.2
  4、安装gcc需要的依赖包
    4.1  mpc-1.0.3
    4.2  mpfr-3.1.4
         http://www.mpfr.org/
    4.3  gmp-5.0.1
         https://gmplib.org/

二、安装
    1、将下载的安装包放在/home/shlian/Downloads/目录,依次解压:codeviz、graphviz、mpc、mpfr、gmp到当前目录

    2、安装gcc依赖包
        cd gmp-5.0.1
        ./configure --prefix=/usr && make && sudo make install && cd ../mpfr-3.1.4 && ./configure --prefix=/usr && make && sudo make install && cd ../mpc-1.0.3 && ./configure --prefix=/usr && make && sudo make install
        执行下面的命令,依次安装gmp、mpfr和mpc,因为mpc依赖于gmp、mpfr
    3、安装graphviz
       cd graphviz-2.38.0
        ./configure --prefix=/usr && make && sudo make install
    4、安装codeviz
       cd codeviz-1.0.12
       cp ../gcc-4.6.2.tar.gz compilers
        ./configure --prefix=/usr && make && sudo make install
       安装gcc大约需要一个小时左右,慢慢的让他安装吧 …… ……经过耐心的等待,终于安装完成,然后就可以使用了

       安装完成后,会有如下信息:
Patched gcc is installed to /usr/local/gccgraph. To compile a project for use with CodeViz, genearlly the following will work 
make CC=/usr/local/gccgraph/bin/gcc or g++ To generate a full.graph file for C, 
use genfull For C++, make sure you use the cppdepn method with 
genfull -g cppdepn or the results will not be what you expect.

        这个gcc默认会被安装到/usr/gccgraph/bin/目录,

三、使用流程

1. 使用刚刚安装的gcc-4.6.2来编译当前目录下所有.c文件,gcc/g++为编译的每个 C/C++文件生成.cdepn 文件。只要编译(参数 -c)就行,无需链接。

即为:/usr/gccgraph/bin/gcc test.c -c


2.调用genful会在当前目录生成一个full.graph文件,该脚本可以生成项目的完整调用图信息文件,记录了所有函数在源码中的位置和它们之间的调用关系。 因此调用图信息文件可能很大很复杂,,缺省使用 cdepn 文件来创建调用图信息文件。

即为:genfull -f test.c.cdepn


3. 使用gengraph可以对给定一组函数生成一个小的调用图 main.ps,显示函数调用关系。

即为:$ gengraph -f main -g full.graph

    在可视化环境,打开main.ps即可,当然也可以生成其他格式的图片,详见后文


四、实例演示
1、写一个简单的程序:
    
2、使用刚刚安装好的gcc编译:
    

       会生成test.c.cdepn文件,里面包含了生成.graph谇的信息:

       

3、生成full.graph文件
    
    查看一下full.graph文件的内容:
    
4、生成图形文件:
    
    这个main.ps即可在可视化环境使用graphviz打开,见效果图:
    
    这图很清楚的反应了函数间的调用关系
    生成不同类型的图形文件: gengraph --output-type "png" -f main #详见gengraph --man
五、命令参数详解
    1、genfull
        genfull --man #可查看详细的参数
        
    2、gengraph
        gengraph --man #可查看详细的参数

-f:指定顶级函数,即入口函数,如main等(当然不限定是main了);

-o:指定输出的postfile文件名,不指定的话就是函数名了,如上面的main;

--output-type:指定输出类型,例如png、gif、html和ps,缺省是ps,如上面的main.ps;

-d:指定最大调用层数;

-s:仅仅显示指定的函数,而不对其调用进行展开;

-i:忽略指定的函数

-t:忽略Linux特有的内核函数集;

-k:保留由-s忽略的内部细节形成的中间文件,为sub.graph

六、后记:
1、在安装完成后,调用gengraph(gengraph -f main -g full.graph)生成ps格式文件时,会报如下错误:
Error:<stdin> error: syntax error in line 4 near ';',不知道为什么,还没有解决,但是可以生成main.ps,并且main.ps信息是正确的,见上面的效果图。
如果使用 gengraph -f main -g full.graph --output-type "png" 则不会报错……
2、如果是c++的文件,使用genfull -g cppdepn test.c.cdepn 生成了full.graph,但是在调用gengraph时,报错:
Error:<stdin> error: syntax error in line 4 near ';
Error: <stdin>: syntax error in line 28 near '_Tp'
并且生成不main.ps,

经多次测试发现,报错与--output-type输出的格式有关系,有的格式不会报错,有的会报错,真心怀疑gengraph存在问题
解决方法还在寻找中…………

猜你喜欢

转载自blog.csdn.net/lianshaohua/article/details/51380994