找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 300|回复: 0

利用calltree查看工程代码中的函数调用关系

[复制链接]

205

主题

173

回帖

6925

积分

论坛元老

积分
6925
发表于 2013-5-29 11:35:44 | 显示全部楼层 |阅读模式
    安装过程有点点繁琐,现将其安装过程记录下来,免得以后忘了。(其实Windows下可以使用understand或source insight也可以达到同样的效果)
    当我们查一个比较大的项目的代码时,往往函数间的关系比较复杂,如果直接看源码,函数间跳来跳去的,头都跳晕了,最后还没看出个所以然来,calltree这个工具满足了广大程序员的“消费”需求,可以很清楚的打印出函数间的调用关系,如果要使用图形化的工具来查看函数调用关系还得装一个软件graphviz。好了,下面开始讲安装过程:
    从下面这个网站上下载源代码:calltree-2.3.tar.bz
    http://citeseer.ist.psu.edu/graham82gprof.html
       1、解压安装到系统路径
        #tar jxvf calltree-2.3.tar.bz
        #cd calltree-2.3
        #make     //不用配置,直接编译
        编译完成后会在当前目录的calltree/OBJ/i686-linux-cc目录下会生成一个二进制文件:calltree,这就是我们需要的文件,将其拷贝到/usr/bin目录下,或者做一个软链接。
    2、开始使用calltree
       下面进入到我一个示例代码中,输入如下命令:
        #calltree -gb -np -m *.c
        
         从中可以很容易的看出函数间的调用关系。
        下面介绍一下各选项:

        -b 就是那个竖线了,很直观地显示缩进层次。
        -g 打印内部函数的所属文件名及行号,外部函数所属文件名和行号也是可打印的,详man

        -np 不要调用c预处理器,这样打印出的界面不会很杂乱,但也可能会产生错误哦,如果我们只看
        函数的调用关系的话,不会有大问题。
        -m 告诉程序从main开始

        还有一个重要的选项是 listfunction ,缩写是lf,用来只打印某个函数中的调用,用法是:
     #calltree -gb -np lf=send_query *.c



     从这个结果可以非常方便的看出函数调用关系,不过还是不够美观哦,所以加上-dot参数,产生一个dot图形吧。
     不过在使用dot命令之前,需要安装一个graphviz软件包,我在cent-os5.5是直接输入以下命令安装的:

     #yum install graphviz*

     如果你的系统不支持yum在线安装,可以去下面这个网站下载相应的rpm包。

     http://www.graphviz.org/

     下面是我的Redhat Enterprise 5.5 el5-i386上需要的源码包图,先安装下面的支持库,我是建立私有yum仓库解决包之间的依赖关系安装的:

        
        
     下面是我写的一个脚本(可以分开每一条命令来执行)test.sh:
     #!/bin/sh

       /usr/bin/calltree -gb -np -m *.c -dot > test.dot

       /usr/bin/dot -Tjpg test.dot -o calltree.jpg

     运行脚本:

     #sh +x test.sh

     下图是生成的函数关系图:

        



   这样就能很清楚的看到各函数间的调用关系了,怎么样,很直观吧,赶快试一试吧。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

果子博客
扫码关注微信公众号

Archiver|手机版|小黑屋|风叶林

GMT+8, 2026-2-1 15:28 , Processed in 0.434479 second(s), 20 queries .

Powered by 风叶林

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表