calltree看代码调用图
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看代码调用图的更多相关文章
- CodeViz产生函数调用图
一.安装过程 1.CodeViz的安装 0).确认你已经安装Graphviz[ http://www.graphviz.org/] 1).下载CodeViz.[ http://www.csn.ul ...
- 使用gprof2dot和graphivz生成程序运行调用图
使用gprof2dot和graphivz生成程序运行调用图 gprof2dot是一个将gprof生成的输出转换为dot脚本的工具.通过给定一个gprof的输出文件,将其转换为生成程序调用图的dot脚本 ...
- 用C代码简要模拟实现一下RPC(远程过程调用)并谈谈它在代码调测中的重要应用【转】
转自:http://blog.csdn.net/stpeace/article/details/44947925 版权声明:本文为博主原创文章,转载时请务必注明本文地址, 禁止用于任何商业用途, 否则 ...
- 【软件构造】第八章第三节 代码调优的设计模式和I/O
第八章第三节 代码调优的设计模式和I/O 本节学习如何通过对代码的修改,消除性能瓶颈,提高系统性能?——代码调优.面向性 能的设计模式 Outline Java调优 代码调优的概念 单例模式(Sing ...
- 看代码学知识之(2) ListView无数据时显示其他View
看代码学知识之(2) ListView无数据时显示其他View 今天看的一块布局是这样的: <!-- The frame layout is here since we will be show ...
- 【Spark篇】---Spark调优之代码调优,数据本地化调优,内存调优,SparkShuffle调优,Executor的堆外内存调优
一.前述 Spark中调优大致分为以下几种 ,代码调优,数据本地化,内存调优,SparkShuffle调优,调节Executor的堆外内存. 二.具体 1.代码调优 1.避免创建重复的RDD,尽 ...
- 剥开比原看代码11:比原是如何通过接口/create-account创建帐户的
作者:freewind 比原项目仓库: Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockchai ...
- 看代码网备份|利用WebClient|eKing.CmdDownLoadDbBakOper|实现定时拷贝数据库备份文件到文件服务器
摘要: 1.有两台服务器 (1)看代码网(记为A):内网IP:10.186.73.30 (2)文件服务器(记为B):内网IP:10.135.87.157 2.在A架设一个网站,端口8088(防火强设置 ...
- php spl标准库简介(SPL是Standard PHP Library(PHP标准库)(直接看代码实例,特别方便)
php spl标准库简介(SPL是Standard PHP Library(PHP标准库)(直接看代码实例,特别方便) 一.总结 直接看代码实例,特别方便易懂 thinkphp控制器利眠宁不支持(说明 ...
随机推荐
- BNUOJ27873:A Special "Happy Birthday" Song!!!
There are n people (excluding myself) in my 30th birthday party. They sing the traditional "hap ...
- Gulp插件汇总
HTML&CSS autoprefixer - parse CSS and add vendor prefixes to rules by Can I Use. gulp-browser-sy ...
- JS禁止/启用滚动条
//禁止滚动条 $(document.body).css({ "overflow-x": "hidden", "overflow-y": & ...
- SQL初级阶段笔记
DataBase Management Stystem(数据库管理系统)简称:DBSM:虽然DBSM并不等于数据库,但行业内通常将DBSM称为数据库,所以一般来说数据库就指的是DBSM. 简单来讲DB ...
- Linux(CentOS)安装配置zeromq、jzmq(解决各种问题)
今天为Hadoop配置zeromq.jzmq遇到各种问题,先是编译出错,到编译成功后测试出错等等,下面将我遇到的问题与大家分享一下. 第一个注意点是:必须先编译安装zeromq,然后在编译jzmq,否 ...
- Spring事务异常回滚,捕获异常不抛出就不会回滚(转载) 解决了我一年前的问题
最近遇到了事务不回滚的情况,我还考虑说JPA的事务有bug? 我想多了....... 为了打印清楚日志,很多方法我都加tyr catch,在catch中打印日志.但是这边情况来了,当这个方法异常 ...
- 编写程序输入一个5x5的矩阵,将最大元素与中心元素交换,并按行列对齐输出。
编写程序输入一个5x5的矩阵,将最大元素与中心元素交换,并按行列对齐输出. 题目描述 编写程序输入一个5x5的矩阵,将最大元素与中心元素交换,并按行列对齐输出. 输入描述 编写程序输入一个5x5的矩阵 ...
- php 常用经验
1.用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中搜寻变量, 单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的”函数”(译注:PHP手 ...
- VHDL testbench 例子,包含向文件中写数据
LIBRARY ieee; USE ieee.std_logic_1164.ALL; use std.textio.all; use ieee.std_logic_textio.all; EN ...
- ubuntu 安装ruby rails
步骤0 - 安装系统需要的包 Mac 请安装 Xcode 开发工具,它将帮你安装好 Unix 环境需要的开发包 Ubuntu 请安装 $ sudo apt-get install -y build-e ...