今天使用了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

calltreetest中文_calltree查看工程代码中的函数调用关系相关推荐

  1. 查找unity工程代码中中文字符

    游戏本地化的时候可能需要搜索工程代码中的中文字符. 这个可以通过加载文件一行一行读取后,通过正则来查询. 下面的代码LoadFile函数通过流加载文件,FindFile通过递归病使用Directory ...

  2. Source Insight中显示函数调用关系的方法

    接上一篇博客,解决了中文注释乱码后,使用Source Insight显示函数调用关系树状图 网上借鉴了一些经验,但感觉可能是版本不同未能完全奏效,下面我将记录我最终探寻出的解决方法 1.双击编辑器中需 ...

  3. 如何查看python代码中的数据集 按住data鼠标右键_Python小练习——电影数据集TMDB预处理...

    加载TMDB数据集,进行数据预处理 TMDb电影数据库,数据集中包含来自1960-2016年上映的近11000部电影的基本信息,主要包括了电影类型.预算.票房.演职人员.时长.评分等信息.用于练习数据 ...

  4. 查看JS代码中\x68等加密数据内容的解决办法

    直接复制代码保存为html格式文件,更改其中的加密内容 <script> var a1="\x68\x74\x74\x70\x73\x3a\x2f\x2f\x77\x77\x77 ...

  5. 通过IDEA查看jar包中的依赖关系

  6. python类中的函数调用关系_Python中类的内置方法与继承关系实例

    1.类的内置方法 Python内部类: 所谓内部类,就是在类的内部定义的类,主要目的是为了更好的抽象现实世界. 例子: 汽车是一个类,汽车的底盘轮胎也可以抽象为类,将其定义到汽车内中,而形成内部类, ...

  7. android库项目管理,一个android工程代码多个差异化项目管理方法探讨

    一个android工程代码多个差异化项目管理方法探讨 核心提示: 1.工程代码中尽量不要使用产品名称.设备名称之类的东西来区分,尽量以功能名称来区分,在工程独立的配置文件中再去配置这个文件: 2.在c ...

  8. 基于C++和Opencv2的虹膜识别工程代码解析

    目录 一.说明 二.虹膜识别工程结构 1. OsiCircle类 2. OsiStringUtils类 3. OsiManager类 4. OsiEye类 5. OsiProcessings类 三.虹 ...

  9. Source Insight 查看函数调用关系使用技巧

    用处 要想了解大型工程的运行原理和过程,分析其函数调用关系是一个很有用的方法.比起自己一个个搜索.记录,使用工具效率会更高.Source Insight 就有一个显示函数调用关系的功能,非常好用. P ...

最新文章

  1. Java的基本数据类型
  2. 信号建模与参数估计作业重新计算
  3. AI创业公司最佳「开发工具」指南火了,还发现了个可挑战Jupyter的「杀手」
  4. 获取RadioButton选中的值
  5. python百题百练 二级题目_计算机二级有必要考吗
  6. Hadoop入门经典:WordCount
  7. 防止按钮重复点击 模型转字典 接口传参不能用汉字,要转码
  8. SmartRaiden 和 Lighting Network 进行去中心化跨链原子资产交换
  9. gson json和类转换_带有GSON和抽象类的JSON
  10. ubuntu wifi固定ip_自制wifi遥控小车!ESP8266实践指南(二)
  11. vs.php中使用apache或IIS7进行外部调试
  12. Reusability1
  13. AndroidStudio安卓原生开发_UI控件_TextView_Button_EditText---Android原生开发工作笔记97
  14. 基于迭代局部搜索和随机惯性权重的BA算法MATLAB实现(ILSSIWBA)
  15. 如何使用monitor(DDMS)抓取traceview文件
  16. 微信小程序Post方法提交数据
  17. 交叉编译libxcb与X11
  18. C++常成员函数与普通成员函数访问比较
  19. Java代码审计学习笔记
  20. 如何将GitHub上的项目或代码文件下载到本地,并且上传自己的代码

热门文章

  1. 云小课|CDN第5课 CDN入门之—我的网站可以用CDN加速吗?
  2. 使用LiteOS Studio图形化查看LiteOS在STM32上运行的奥秘
  3. “3+3”看华为云FusionInsight如何引领“数据新基建”持续发展
  4. Stanford公开课《编译原理》学习笔记(1~4课)
  5. 【奇技淫巧】Android真机调试看不到应用logcat或者应用logcat信息太少的解决方法
  6. Python爬虫从入门到精通——基本库re的使用:正则表达式
  7. linux查进程内存问题,关于linux下内存问题排查的工具
  8. oracle .bdb,oracle 11g RAC crfclust.bdb过大的处理
  9. angularjs组件间通讯_angular组件间通讯的实现方法示例
  10. C++ 堆区和栈区的区别