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 已经在博客文件中

[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:]:
| fun1 [test.c:]
| | fun2 [test.c:]
| | | fun3 [test.c:]
| | | | 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

calltree查看工程代码中的函数调用关系的更多相关文章

  1. 在linux代码中打印函数调用的堆栈的方法

    之前一直有这样的需求,当时问到,也没搜到方法,现在竟然既问到了,也搜到了,哎,世事真是不能强求啊! 在Linux内核调试中,经常用到的打印函数调用堆栈的方法非常简单,只需在需要查看堆栈的函数中加入: ...

  2. eclipse快速查看工程代码行数

    1.点击要统计的项目或许文件夹,在菜单栏点击Search,然后点击File... 2.选中正则表达式(Regular expression),并在搜索文本框输入\n ;3.在文件名中输入*或*.jav ...

  3. Apache Spark源码走读之3 -- Task运行期之函数调用关系分析

    欢迎转载,转载请注明出处,徽沪一郎. 概要 本篇主要阐述在TaskRunner中执行的task其业务逻辑是如何被调用到的,另外试图讲清楚运行着的task其输入的数据从哪获取,处理的结果返回到哪里,如何 ...

  4. cflow察看工程函数调用关系+Linux 0.11 内核实验环境

    http://savannah.gnu.org/projects/cflow http://tinylab.org/linux-0.11-lab/ http://ftp.gnu.org/gnu/cfl ...

  5. 用cflow工具生成代码函数调用关系

    1. 安装 sudo apt-get install cflow 2.使用 cflow [options...] [file]... 例: cflow main.c 生成main.c文件例的函数调用关 ...

  6. 用cflow工具生成代码函数调用关系【转】

    转自:http://www.cnblogs.com/feng-zi/p/5469652.html . 安装 sudo apt-get install cflow .使用 cflow [options. ...

  7. 从jsTree演示代码中提取的在线文件查看

    从jsTree演示代码中提取的在线文件查看 jsTree 请参考:https://www.jstree.com/ 效果如下: 代码下载:http://files.cnblogs.com/files/z ...

  8. 浅谈UML中类之间的五种关系及其在代码中的表现形式

    本文转载:http://www.cnblogs.com/DebugLZQ/archive/2013/05/13/3066715.html 什么是类? 将某类东西归纳在一起,可以成为一个类. 类有很多种 ...

  9. Intellij IDEA 中如何查看maven项目中所有jar包的依赖关系图(转载)

    Intellij IDEA 中如何查看maven项目中所有jar包的依赖关系图 2017年04月05日 10:53:13 李学凯 阅读数:104997更多 所属专栏: Intellij Idea   ...

随机推荐

  1. pyqt5 窗体布局

    窗体布局 1使用qtdesigner新建一个对话框,然后拖放几个按钮和文本框,按钮使用水平布局,效果如下: 鼠标选中水平布局再选中文本框,进行垂直布局,如下: 垂直布局后的效果如下: 然后,如何让窗体 ...

  2. https WebAPi

    前言 话说又来需求了,之前对于在SelfHost中需要嵌套页面并操作为非正常需求,这回来正常需求了,客户端现在加了https,老大过来说WebAPi访问不了了,这是什么情况,我去试了试,还真是这个情况 ...

  3. Java Fluent Restful API自动化测试框架

    这是一个Restful API自动化测试框架,这是一个能让你写出高可读性测试代码的测试框架! 项目目标 话说目前行业内,Restful API自动化测试框架已经不是稀罕物了,各个语言都有自己的实现机制 ...

  4. Matlab norm 用法小记

    Matlab norm 用法小记 matlab norm (a) 用法以及实例 norm(A,p)当A是向量时norm(A,p)   Returns sum(abs(A).^p)^(1/p), for ...

  5. Netty高性能之道

    1. 背景 1.1. 惊人的性能数据 最近一个圈内朋友告诉我,通过使用Netty4 + Thrift压缩二进制编解码技术,他们实现了10W TPS(1K的复杂POJO对象)的跨节点远程服务调用.相比于 ...

  6. Java多线程(四)之ConcurrentSkipListMap深入分析

    一.前言 concurrentHashMap与ConcurrentSkipListMap性能测试 在4线程1.6万数据的条件下,ConcurrentHashMap 存取速度是ConcurrentSki ...

  7. OpenWrt挂载USB储存设备实现Samba共享

    没有USB接口的路由器不是好路由器,有了USB接口OpenWrt才有更多的玩法,比如挂载U盘.移动硬盘等USB储存设备实现Samba共享,打造小型家庭服务器. 1.安装与USB相关的软件包: opkg ...

  8. 传智播客C语言视频第二季(第一季基础上增加诸多C语言案例讲解,有效下载期为10.5-10.10关闭)

    卷 backup 的文件夹 PATH 列表卷序列号为 00000025 D4A8:14B0J:.│  1.txt│  c语言经典案例效果图示.doc│  ├─1传智播客_尹成_C语言从菜鸟到高手_第一 ...

  9. mkimage使用详解

    uboot源代码的tools/目录下有mkimage工具,这个工具可以用来制作不压缩或者压缩的多种可启动映象文件. mkimage在制作映象文件的时候,是在原来的可执行映象文件的前面加上一个0x40字 ...

  10. linux安装JDK TOMCAT

    1.下载包 到http://apr.apache.org/下载下面3个包 apr-1.4.2.tar.gz apr-iconv-1.2.1.tar.gz apr-util-1.3.10.tar.gz  ...