calltree查看工程代码中的函数调用关系
2016-06-08 11:45
399 查看
http://blog.csdn.net/elitemouse/article/details/41680113
http://www.tinylab.org/callgraph-draw-the-calltree-of-c-functions/ http://www.cnblogs.com/louxin/archive/2012/01/02/2310488.html
calltree 已经在博客文件中
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
http://www.tinylab.org/callgraph-draw-the-calltree-of-c-functions/ http://www.cnblogs.com/louxin/archive/2012/01/02/2310488.html
calltree 已经在博客文件中
[root@server1 ~]# cat test.c #include <stdio.h> #include <unistd.h> void fun1(void) { fun2(); } void fun2(void) { fun3(); } fun3() { printf("test1"); } int main(void) { fun1(); return 0; } [root@server1 ~]# ./calltree -gb -np -m test.c main [test.c:18]: | fun1 [test.c:6] | | fun2 [test.c:10] | | | fun3 [test.c:14] | | | | printf [root@server1 ~]# ./calltree -b -np -m test.c main: | fun1 | | fun2 | | | fun3 | | | | printf calltree -b -np -m test.c -dot >test.dot dot -Tjpg test.dot -o calltree.jpg今天使用了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
相关文章推荐
- 基于.Net Framework 4.0 Web API开发(5):ASP.NET Web APIs AJAX 跨域请求解决办法(CORS实现)
- spring boot框架
- Python入门:os部分方法介绍(二)
- java反射,让代码充满活力(一)
- JavaSrcipt获取HtmlStyle属性兼容方法
- maven项目打包发布问题-Unable to locate Spring NamespaceHandler for XML schema namespace
- Python while 循环使用的简单实例
- PHP_SQL根据当前坐标查询5公里以内的信息
- SpringMVC中url-pattern /和/*的区别
- Python爬虫实战(2):爬取京东商品列表
- C#开发奇技淫巧三:把dll放在不同的目录让你的程序更整洁
- JAVA中批量插入数据
- 为什么响应式编程并非一时之势?
- QT 用 paintEvent 实现绘制钟表的列子
- Yii 安装二维码扩展Qrcode
- C# web 获取服务端cookie
- 为什么响应式编程并非一时之势?
- Pycharm2016.2注册码(python编码利器)
- C#报警声音
- PHP压缩图片代码