zoukankan      html  css  js  c++  java
  • 用 Graphviz + CodeViz可视化函数调用

    http://blog.chinaunix.net/u3/119403/showart_2347423.html

     安装

      1. 安装 GraphViz
         调用图的生成依赖于 GraphViz,所以首先要安装 GraphViz。可以下载源码包编译、安装。
    我在这偷点懒:tbag@:~$ sudo apt-get install graphviz

        2. 简单安装 CodeViz

    下载CodeVize源码包:http://www.csn.ul.ie/~mel/projects/codeviz/codeviz-1.0.11.tar.gz
    解压:tbag@:~/down$ tar xvf codeviz-1.0.11.tar.gz
    tbag@:~/down$ cd codeviz-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到 cd codeviz-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$ cd compilers/
    tbag@:~/down/codeviz-1.0.11/compilers$ ls
    gcc-3.4.6.tar.gz  gcc-graph  gcc-patches  install_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$ make install-codeviz
    (前面已经安装了 gcc,所谓的安装 codeviz 只是将make install-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 -o tbag
    2)  tbag@:~/test/ jpeg$ genfull
    3)  tbag@:~/test/jpeg$ gengraph -d 2 -output-type "png" -f jpeg_decompress2bmp

    第一步,使用刚刚安装的gcc-3.4.6来编译当前目录下所有.c文件,gcc/g++为编译的每个 C/C++文件生成.cdepn 文件。
    第二步:使用此脚本会在当前目录生成一个full.graph文件,该脚本可以生成项目的完整调
    用图信息文件, 因此调用图信息文件可能很大很复杂, 缺省使用 cdepn 文件来创建调用图信息文件;

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

    http://blog.csdn.net/Solstice/archive/2005/09/22/486788.aspx

     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绘制图形。


    CodeViz 原本是作者用来分析 Linux virtual memory 的源码时写的一个小工具,现在已经基本支持 C++ 语言,最新的 1.0.9 版能在 Windows + Cygwin 下顺利地编译使用:)。需要注意的是:1) 下载 GCC 3.4.1 的源码 gcc-3.4.1.tar.gz 放到 codeviz-1.0.9/compilers,2) 安装 patch 程序(属于Utils类),3) 从 http://www.graphviz.org 下载并安装 Graphviz 2.6。

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

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

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

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

    首先分析main():

    1. gengraph --output-type gif -f main
    分析main()的call graph,得到的图如下,看不出要领:


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


    3. gengraph --output-type gif -f main -s OSInit -i "OSCPUSaveSR;OSCPURestoreSR"
    基本上每个函数都会有进入/退出临界区的代码,忽略之(参数 -i)。得到的图如下,基本清楚了:


    4. gengraph --output-type gif -f main -s "OSInit;OSSemCreate" -i "OSCPUSaveSR;OSCPURestoreSR" -k
    OSSemCreate()的内部细节似乎也不用关心,不过保留中间文件sub.graph(参数 -k),得到的图如下,


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


    接着分析OSTimeDly()的被调用关系:

    gengraph --output-type gif -r -f OSTimeDly

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



    最后看看Task()直接调用了哪些函数:

    gengraph --output-type gif -d 1 -f Task

    只看从Task出发的第一层调用(参数 -d 1):




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





  • 相关阅读:
    一些总结与思考(聊聊最近,希望对大家有所帮助)
    操作符、语句、函数——Javascript高级程序设计
    Javascript高级程序设计——语法、关键字、保留字、变量、数据类型
    Javascript高级程序设计——Javascript简史+使用Javascript
    Angular.js!(附:聊聊非原生框架项目)
    JS事件绑定深入
    Javascript事件绑定及深入
    实现API管理系统的几个重要关键词
    实现API优先设计的重要性和实现方式
    对API进行版本控制的重要性和实现方式
  • 原文地址:https://www.cnblogs.com/xuxm2007/p/1851086.html
Copyright © 2011-2022 走看看