calltree源代码调用图+callgrath 源代码函数调用图

http://www.tinylab.org/callgraph-draw-the-calltree-of-c-functions/

http://www.cnblogs.com/louxin/archive/2012/01/02/2310488.html

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

今天使用了calltree这个源码函数关系查看工具,结果很直观,但安装过程有点点繁琐,现将其安装过程记录下来,免得以后忘了。

当我们查一个比较大的项目的代码时,往往函数间的关系比较复杂,如果直接看源码,函数间跳来跳去的,头都跳晕了,最后还没看出个所以然来,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/

下面是我写的一个脚本(可以分开每一条命令来执行)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

时间: 2024-10-24 14:01:59

calltree源代码调用图+callgrath 源代码函数调用图的相关文章

使用xdebug分析thinkphp框架函数调用图

开发中需要性能调优,使用xdebug分析thinkphp框架函数调用图. 关于xdebug的安装参考这2篇 NetBeans配置Xdebug 远程调试PHP php扩展xdebug安装以及用kcachegrind系统分析 1.安装xdebug 需要先去http://www.xdebug.org看看一些文档,xdebug作为php扩展安装 # http://www.xdebug.org/files/xdebug-2.3.3.tgz # tar -xzf xdebug-2.3.3.tgz# cd x

avr频率占空比可调波形输出子函数

#ifndef _KPWM_H_ #define _KPWM_H_ /*************avr频率占空比可调波形输出子函数**************/ ////作者:王泡泡 ///形参:Fclk赋值设定频率(单位为k)  范围:  1K 到 256K ///      rat设定占空比(单位为百分比)eg:40 则输出方波占空比为百分之四十 //频率误差小于2%,占空比误差小于5% //PWM频率计算公式为f=fox/N(1+TOP) fox为晶振频率 N为分频系数 TOP为计数计数最

【Java集合源代码剖析】LinkedList源代码剖析

转载请注明出处:http://blog.csdn.net/ns_code/article/details/35787253 您好.我正在參加CSDN博文大赛.假设您喜欢我的文章,希望您能帮我投一票,谢谢. 投票地址:articleid=35568011" style="color: rgb(106, 57, 6); text-decoration: none; ">http://vote.blog.csdn.net/Article/Details?articleid=3

【Java集合源代码剖析】HashMap源代码剖析

转载请注明出处:http://blog.csdn.net/ns_code/article/details/36034955 您好,我正在參加CSDN博文大赛,假设您喜欢我的文章.希望您能帮我投一票.谢谢! 投票地址:http://vote.blog.csdn.net/Article/Details? articleid=35568011 HashMap简单介绍 HashMap是基于哈希表实现的,每个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,相同会自己

LAMP 系统性能调优之网络文件系统调优

LAMP 系统性能调优之网络文件系统调优 2011-03-21 09:35 Sean A. Walberg 网络转载 字号:T | T 使用LAMP系统的用户,都想把自己LAMP性能提高运行的速度提高,那它有一点可以调优: 网络文件系统 ,我们知道网络文件系统是网络共享磁盘的一个系统,我们来进行调优下! AD:2014WOT全球软件技术峰会北京站 课程视频发布 图-LAMP LAMP网络文件系统调优 网络文件系统(NFS)是一种通过网络共享磁盘的方法.NFS 可以帮助确保每个主机具有相同数据的拷

break MISSING_BLOCK_LABEL_160; 看源代码出现的,源代码是反编译的

break MISSING_BLOCK_LABEL_160; FileNotFoundException fnfe; fnfe; out.close(); throw fnfe; in.close(); break MISSING_BLOCK_LABEL_268; fnfe; fnfe.printStackTrace(); in.close(); break MISSING_BLOCK_LABEL_268; Exception exception; exception; in.close();

我调过的最难调的Bug

每个程序员都有些不畏死亡决战猛兽的英雄事迹.以下这些是我的. 内存冲突 毕业不到半年,拿着刚到手的文凭,我在Lexmark公司的一个嵌入式Linux固件开发团队中负责追踪一个内存冲突的问题.因为内存冲突的原因和问题表象总是相差非常大,所以这类问题很难调.有可能是因为缓存溢出,也有可能是指针未初始化,或是指针被多次free,亦或是某处的DMA错误,但是你所见的却是一堆神秘的问题:挂起.指令未定义.打印错误,以及未处理的内核错误.这些都非常频繁,内存冲突看上去似乎是随机出现又很难重现. 要调试这种问

第十四周项目4-1:处理C++源代码的程序-查找main()函数

问题及代码: /* *Copyright (c)2015,烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:project.cpp *作 者:陈文青 *完成日期:2015年6月16日 *版 本 号:v1.0 * *问题描述:(1)读入一个C++程序,判断其中是否只有一个main()函数,输出"暂时没有发现问题",或者"没有main()函数",或者"不能定义多个main()函数": 提示1:简单处理,可以只比较判

gcc源代码分析,在expand_call ()函数 和expand_expr_stmt ()函数的开始处加入debug_tree ()函数

对于expand_call函数来说最主要的参数就是exp这个tree树, 打印出来之后我们终于看到了printf和Hello,world! expand_call <call_expr 840f0 type <integer_type 824d0 int permanent SI size <integer_cst 8254c literal permanent 4 align 32 size_unit 8 sep_unit 32 symtab 0 sep <integer_cst