calltree是在linux下面看c代码(尤其是复杂的内核代码)的神器。

推荐  calltree+vim + ctags + cscope + taglist 【 vim: 搭建vim看代码的环境   http://www.cnblogs.com/mylinux/p/5013588.html】

  或者 calltree + source insight

source insight能方便地查看向上和向下的函数(变量等)调用关系,并且支持多种语言,几乎是无可替代的。但调用深度太大的时候,人就记不住了,这个时候calltree可以生成一个全局的调用图,便于很快掌握代码框架。

如想看内核代码start_kernel干了些什么:

#calltree -np -b  list=start_kernel    depth=3 `find ./init/ ./kernel/ -name "*.c"` > maps

#vi maps

start_kernel:
| WARN
| acpi_early_init
| anon_vma_init
| boot_cpu_init
| | set_cpu_active
| | | cpumask_clear_cpu
| | | cpumask_set_cpu
| | | to_cpumask
| | set_cpu_online
| | | cpumask_clear_cpu
| | | cpumask_set_cpu
| | | to_cpumask
| | set_cpu_possible
| | | cpumask_clear_cpu
| | | cpumask_set_cpu
| | | to_cpumask
| | set_cpu_present
| | | cpumask_clear_cpu
| | | cpumask_set_cpu
| | | to_cpumask
| | smp_processor_id
| boot_init_stack_canary
| buffer_init
| build_all_zonelists
| calibrate_delay
| | calibrate_delay_converge
| | | __delay
| | calibrate_delay_direct
| | | printk
| | | read_current_timer
| | | time_before_eq
| | calibrate_delay_is_known

下载:
    calltree-2.3.tar.bz2 http://download.chinaunix.net/download.php?id=2245&ResourceID=1172
    sudo apt-get install graphviz

使用:    
    calltree -help
    calltree -np -gb -m *.c
    calltree -np -gb lf=send_query *.c
    calltree -np -b  list=start_kernel    depth=4 `find ./init/ -name "*.c"` > maps
    calltree -np -b  list=raw_spin_lock_irqsave  `find . -name "*.c"`
    calltree -np -gb lf=raw_spin_lock_irqsave    `find . -name "*.c"`

还可以生成一个调用图,以kernel为例
        calltree -np -b -dot list=start_kernel ./init/*.c > ~/start_kernel.dot
        dot -T png start_kernel.dot -o ./testhaha.png
       
    
    下面介绍一下各选项:
    -b 就是那个竖线了,很直观地显示缩进层次。
    -g 打印内部函数的所属文件名及行号,外部函数所属文件名和行号也是可打印的,详man
    -np 不要调用c预处理器,这样打印出的界面不会很杂乱,但也可能会产生错误哦,如果我们只看函数的调用关系的话,不会有大问题。
    -m 告诉程序从main开始
    还有一个重要的选项是listfunction ,缩写是lf,用来只打印某个函数中的调用,用法是: lf=your_function
    depth=#选项: 例如: calltree -gb -np -m bind9/bin/named/*.[c.h] depth=2 > codecalltree.txt

注意:

  调用关系一般比较复杂,最好设置好(1)想要关心的函数(2)调用深度(3)关心的目录,否则又会引入过多无关选项,干扰视线。

calltree看代码调用图的更多相关文章

  1. CodeViz产生函数调用图

    一.安装过程   1.CodeViz的安装 0).确认你已经安装Graphviz[ http://www.graphviz.org/] 1).下载CodeViz.[ http://www.csn.ul ...

  2. 使用gprof2dot和graphivz生成程序运行调用图

    使用gprof2dot和graphivz生成程序运行调用图 gprof2dot是一个将gprof生成的输出转换为dot脚本的工具.通过给定一个gprof的输出文件,将其转换为生成程序调用图的dot脚本 ...

  3. 用C代码简要模拟实现一下RPC(远程过程调用)并谈谈它在代码调测中的重要应用【转】

    转自:http://blog.csdn.net/stpeace/article/details/44947925 版权声明:本文为博主原创文章,转载时请务必注明本文地址, 禁止用于任何商业用途, 否则 ...

  4. 【软件构造】第八章第三节 代码调优的设计模式和I/O

    第八章第三节 代码调优的设计模式和I/O 本节学习如何通过对代码的修改,消除性能瓶颈,提高系统性能?——代码调优.面向性 能的设计模式 Outline Java调优 代码调优的概念 单例模式(Sing ...

  5. 看代码学知识之(2) ListView无数据时显示其他View

    看代码学知识之(2) ListView无数据时显示其他View 今天看的一块布局是这样的: <!-- The frame layout is here since we will be show ...

  6. 【Spark篇】---Spark调优之代码调优,数据本地化调优,内存调优,SparkShuffle调优,Executor的堆外内存调优

    一.前述 Spark中调优大致分为以下几种 ,代码调优,数据本地化,内存调优,SparkShuffle调优,调节Executor的堆外内存. 二.具体    1.代码调优 1.避免创建重复的RDD,尽 ...

  7. 剥开比原看代码11:比原是如何通过接口/create-account创建帐户的

    作者:freewind 比原项目仓库: Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockchai ...

  8. 看代码网备份|利用WebClient|eKing.CmdDownLoadDbBakOper|实现定时拷贝数据库备份文件到文件服务器

    摘要: 1.有两台服务器 (1)看代码网(记为A):内网IP:10.186.73.30 (2)文件服务器(记为B):内网IP:10.135.87.157 2.在A架设一个网站,端口8088(防火强设置 ...

  9. php spl标准库简介(SPL是Standard PHP Library(PHP标准库)(直接看代码实例,特别方便)

    php spl标准库简介(SPL是Standard PHP Library(PHP标准库)(直接看代码实例,特别方便) 一.总结 直接看代码实例,特别方便易懂 thinkphp控制器利眠宁不支持(说明 ...

随机推荐

  1. BNUOJ27873:A Special "Happy Birthday" Song!!!

    There are n people (excluding myself) in my 30th birthday party. They sing the traditional "hap ...

  2. Gulp插件汇总

    HTML&CSS autoprefixer - parse CSS and add vendor prefixes to rules by Can I Use. gulp-browser-sy ...

  3. JS禁止/启用滚动条

    //禁止滚动条 $(document.body).css({ "overflow-x": "hidden", "overflow-y": & ...

  4. SQL初级阶段笔记

    DataBase Management Stystem(数据库管理系统)简称:DBSM:虽然DBSM并不等于数据库,但行业内通常将DBSM称为数据库,所以一般来说数据库就指的是DBSM. 简单来讲DB ...

  5. Linux(CentOS)安装配置zeromq、jzmq(解决各种问题)

    今天为Hadoop配置zeromq.jzmq遇到各种问题,先是编译出错,到编译成功后测试出错等等,下面将我遇到的问题与大家分享一下. 第一个注意点是:必须先编译安装zeromq,然后在编译jzmq,否 ...

  6. Spring事务异常回滚,捕获异常不抛出就不会回滚(转载) 解决了我一年前的问题

    最近遇到了事务不回滚的情况,我还考虑说JPA的事务有bug? 我想多了.......    为了打印清楚日志,很多方法我都加tyr catch,在catch中打印日志.但是这边情况来了,当这个方法异常 ...

  7. 编写程序输入一个5x5的矩阵,将最大元素与中心元素交换,并按行列对齐输出。

    编写程序输入一个5x5的矩阵,将最大元素与中心元素交换,并按行列对齐输出. 题目描述 编写程序输入一个5x5的矩阵,将最大元素与中心元素交换,并按行列对齐输出. 输入描述 编写程序输入一个5x5的矩阵 ...

  8. php 常用经验

    1.用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中搜寻变量, 单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的”函数”(译注:PHP手 ...

  9. VHDL testbench 例子,包含向文件中写数据

      LIBRARY ieee; USE ieee.std_logic_1164.ALL; use std.textio.all; use ieee.std_logic_textio.all;   EN ...

  10. ubuntu 安装ruby rails

    步骤0 - 安装系统需要的包 Mac 请安装 Xcode 开发工具,它将帮你安装好 Unix 环境需要的开发包 Ubuntu 请安装 $ sudo apt-get install -y build-e ...