使用Vim+Ctags+Cscope阅读源代码

From: http://blog.csdn.net/jsufcz/article/details/3988883


--孔建军(Kongove.CN)
2008.11.15

代码阅读工具简介

对于学习Linux内核的人来说,源代码的阅读尤为重要。

因为所有设计思想、内部机制都是
以代码的形式实现,所有的资料也都是为了更好的诠释代码。那么一个好的阅读工具,能
够提高阅读的效率和效果。常见的代码阅读工具有,Source Navigator、Source Insight
、lxr、Cscope、Kscope等。

 • "Source Navigator"是红帽子公司的,以GNU GPL发布,可从官方网站[1]下载使用。
 • "Source Insight"目前只有Windows平台的,官方网站[2]。需要注册才能使用,或者
从网上下载注册机生成注册码。在Linux下通过wine模拟虽然可以方便使用,但它毕竟
是Windows平台的东西,并不能很自由的使用。
 • lxr(linux cross reference)[3]为程序源代码建立索引数据库,利用perl脚本CGI动态
生成包含源码的web页面,你可以用任何一种浏览器查阅。缺点是需要服务器支持,还
有速度。
 • "Cscope"[4]为终端下的代码阅读工具,资源消耗少,对那些忠于命令行的行操作的人
,使用起来更加方便、灵活。这也是这篇文章推荐使用的一个重要原因。也有人把
Cscope和Emasc绑定阅读源码。当然工具的选取,也取决于个人习惯。

Vim+Ctags+Cscope

cscope的工作需要vim、ctags的配合,它们都是基于命令行的。在Ubuntu下,用户只需执
行“sudo apt-get install cscope cscope-indexer ctags vim-full”即可完成软件安装。
下面只是给出了三种工具的常用方法,更多功能可查看man手册,或者官方文档。

Vim

vim被看作是专门为程序员打造的文本编辑器,其丰富的编辑命令都是常用的简单字符,用
户很容易上手。vim可对180多种语言的语法高亮,对C语言自动缩进,真则表达式字符匹配
查找,功能强大,并支持多个操作系统平台。关于vim的使用,这里不做讲解。vim中文文
档[5]。
在Ubuntu下默认安装的vim,没有语法加亮功能。所以需要安装vim-full,并在vim 配置
文件 ~/.vimrc中添加一行 "syntax on" 这样在vim中打开的源码就有了语法高亮显示。
vim自带了很多颜色主题,可以直接选取下面一行添加到vim配置文件当中,重新打开vim即
可生效。

colorscheme elflord "我使用这个
colorscheme darkblue
colorscheme evening
colorscheme murphy
colorscheme torte
colorscheme desert

Ctags

在源代码根目录下执行 ctags -r 命令用来为程序源代码生成标签文件,其-r选项表示递
归操作,同时为子目录也生成标签文件。vim利用生成的标签文件,可以进行相应检索、并
在不同的文件C语言元素之间来回切换。

在vim中ctags的简单使用
1) 跳转到指定的函数进入vim后,用 “:tag func_name“ 跳到函数func_name处。使用tag
命令时,可以使用TAB键进行匹配查找,继续按TAB键向下切换。
某个函数有多个定义时

:tag
跳到第一个定义处,优先跳转到当前文件
:tnext
跳到第一个
:tfirst
跳到前count个
:[count]tprevious
跳到后count个
:[count]tnext
跳到最后一个
:tlast
你也可以在所有tagname中选择:
:tselect tagname

如果想跳到包含block的标识符:“tag /block” 然后用TAB键来选择。这里'/'就是告诉vim
'block'是一个语句块标签。
2)用“CTRL + ]“快捷键,跳转到光标所在函数标识符的定义处。
3)使用“CTRL + T”退回上层。如果想在以write_开头的标识符中选择一下, :tselect /^
write_ 这里,'^'表示开头,同理,'$'表示末尾。多个同名的标识符

Cscope

运行cscope命令,出现两个面板,上方是一个查找结果的显示面板,下方是一个查找条件
指定面板。使用TAB键在两个面板间切换,也可使用上下左右方向件和翻页键在同一面板内
贴换位置。选中显示面板的某个项,回车即可进入该文件,这是调用vim打开文件,这时就
可以结合ctags使用了。当然也可以直接使用vim打开文件,结合ctags阅读源码。
使用前,必须现使用“cscope-indexer -r”命令递归生成索引信息文件。特殊情况下,还需
要用户使用find命令,主动生成索引信息文件,并指定给cscope工具。 cscope提供了如下
九种查询方式:

Find this C symbol:
#查找指定的C符号
Find this global definition:
#查找指定的全局定义
Find functions called by this function:
#查找指定函数调用的函数
Find functions calling this function:
#查找调用指定函数的函数
Find this text string:
#查找字符串
Change this text string:
#修改指定字符串
Find this egrep pattern:
#查找匹配字符
Find this file:
#查找指定文件
Find files #including this file:
#指定引用头文件进行查找

在对应某一项中输入查找条件,回车即可进行查询,并将结果显示在显示面板。

应用实例

下面以使用cscope阅读内核源代码为例:

$ wget http://kernel.org/pub/linux/kernel/v2.6/linux-2.6.27.6.tar.bz2
#从Linux内核官网下载内核源代码
$ tar xvfj linux-2.6.27.6.tar.bz2
#解压文件
$ cd linux-2.6.27.6
#进入源代码根目录
$ ctags -R
#递归生成标签文件
$ cscope-indexer -r
#递归生成索引信息文件
$ cscope
#使用cscope阅读源码

标签文件、索引信息文件只需要第一次或者代码发生变动时生成,以后使用直接运行
cscope即可。



[1] http://sourcenav.sourceforge.net/
[2] http://www.sourceinsight.com/
[3] http://lxr.linux.no/
[4] http://cscope.sourceforge.net/
[5] http://vcd.gro.clinux.org/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/406079.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql 和区块链的差别_论区块链是什么数据库——正名篇

区块链是数据库,这句话大家都挑不出毛病。这就好比说,人是一种生物,树是一种生物。这是绝对的真理,同时也是一句废话。mysql是一种数据库,mongodb是一种数据库,leveldb是一种数据库,但是我们在提…

Silverlight 4新控件PivotViewer介绍

早在Silverlight 4正式版发布之前,微软发布PivotViewer控件的演示版本,其处理以及展示大批量数据的功能吸引不少开发人员和终端客户,今天微软发布了PivotViewer控件正式版本,本文将介绍一下PivotViewer控件。首先了解一下PivotVie…

Android add external jar

A Best way to add External Jars to your Anroid Project or any Java project is: Create a folder called ‘libs’ into you project root folderCopy your Jar files to the libs folderNow right click on the Jar file and then select Build Path > Add to Build Pa…

python获取命令行输出结果

python获取命令行输出结果,并对结果进行过滤找到自己需要的! 这里以获取本机MAC地址和IP地址为例! # coding: GB2312 import os, re# execute command, and return the output def execCmd(cmd):r os.popen(cmd)text r.read()r.close()ret…

mysql 模拟100万数据_教你如何6秒钟往MySQL插入100万条数据的实现

一、思路往MySQL中插入1000000条数据只花了6秒钟!关键点:1.使用PreparedStatement对象2.rewriteBatchedStatementstrue 开启批量插入,插入只执行一次,所有插入比较快。二、 代码package test0823.demo1;import java.sql.*;/*** au…

SQL基础-- 数据处理(DML、RETURNING、MERGE INTO)

-- --SQL基础--> 数据处理(DML、RETURNING、MERGE INTO) -- 一、常用的DML语句及事物处理 向表中插入数据(INSERT) 更新表中数据(UPDATE) 从表中删除数据(DELETE) 将表中数据和并(MERGE) 控制事务(TRANSACTION) 二、DML 可以在下列条件下执行: 向表中插入数据 修改现存数据 …

大型网站系统架构实践(四)http层负载均衡之haproxy实践篇(一)

方案 上篇文章讲到了负载均衡的相关理论知识,这篇文章我打算讲讲实践方法以及实践中遇到的问题 方案:haproxy http层负载均衡 安装一个haproxy服务,两个web服务 haproxy:192.168.1.227:80 web1 http://192.168.1.226:8081/login w…

[Python]使用 lambda 函数

From:http://woodpecker.org.cn/diveintopython/power_of_introspection/lambda_functions.html 4.7. 使用 lambda 函数 4.7.1. 真实世界中的 lambda 函数 Python 支持一种有趣的语法,它允许你快速定义单行的最小函数。这些叫做 lambda 的函数,是从 Li…

mysql修改子分区_创建MySQL子分区方法

创建MySQL子分区方法发布时间:2020-05-26 15:11:15来源:51CTO阅读:216作者:三月本文主要给大家介绍创建MySQL子分区方法,文章内容都是笔者用心摘选和编辑的,具有一定的针对性,对大家的参考意义还…

const char * array[]和char * const array[]

int main() {char abc[] "abc";char def[] "def";char * const array[] {"abc", "def"};char * const array2[] {abc, def};const char * array3[3] {"abc", "def"};//char * const array3[2]; //error,定义…

日志处理(二) 日志组件logback的介绍及配置使用方法(转)

本文转自:http://www.cnblogs.com/yuanermen/archive/2012/02/13/2348942.html http://www.cnblogs.com/yuanermen/archive/2012/02/13/2349609.html 一、logback的介绍 Logback是由log4j创始人设计的又一个开源日志组件。logback当前分成三个模块:logba…

TNS-03505 oracle用户可以tnsping通,普通用户tnsping报错

From: http://zxf261.blog.51cto.com/701797/750308 今天碰到了一个有趣的问题 oracle用户可以tnsping通&#xff0c;普通用户tnsping报错 用普通用户tnsping数据库的时候报 TNS-03505: Failed to resolve name 而用oracle用户tnsping数据库的时候却可以ping通 <34 linux-si…

python package安装包_安装Python包(第三方库)

检查python版本如果“提示 python 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。”&#xff0c;可能有2种原因1、进入的目录不对 (切换目录后再查看)C:\Users\zhangXXXX>pythonpython 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。C:…

Windows2003+SQL2000的集群安装手册

1 集群服务器安装及配置 步骤节点1节点2存储注释安装配置系统上电上电断电检查所有共享总线上的存储设备是否都已经断电&#xff0c;给各节点上电。1.1 安装Windows Server 2003操作系统 在服务器1和服务器2分别独立安装Windows Server 2003操作系统。安装要开始安装过程&#…

wpf全局异常

在App.xaml文件中 添加DispatcherUnhandledExceptionEventArgs 新增对应事件 转载于:https://www.cnblogs.com/ChenRihe/p/4421049.html