linux源代码阅读工具(转载)
ctags
ctags应该是几个里面最古老的一个了,当然也是获得支持最多的一个,vim默认就支持ctags产生的tag数据库,不过原来的ctags名符其实, 只支持C语言,且分析不够细腻。其新版本名为exuberant ctags,但是它已经远远超出了它名字的范畴,支持包括C语言在内的33种编程语言,准确度上也不错,并且它的开发仍在如火如荼地进行着,前途无量啊!
配合vim使用,基本上能满足用户的要求。
常用命令:
建立数据库命令:
exuberant-ctags 在vim编辑器中浏览:
:ta x
跳转到符号x的定义处,如果有多个符号,直接跳转到第一处
:ts x
列出符号x的定义
:tj x
可以看做上面两个命令的合并,如果只找到一个符号定义,那么直接跳转到符号定义处,如果有多个,则让用户自行选择。
Ctrl+]
跳转到当前光标下符号的定义处,和ta类似。
Ctrl+t
跳转到上一个符号定义处,和上面的配合基本上就能自由跳转了。
另外两个:tn, :tp是在符号的多个定义之间跳转
美中不足,只能查找符号的定义!
Cscope
相比ctags的只能查找符号的定义,cscope则显得更加丰富,虽然他支持C语言,但是它除了能查找函数的定义,还能查找函数在哪里被调用过等,所以能在一定程度上弥补ctags的不足。
常用命令:
建立数据库的命令:
cscope
和vim配合使用:
不再重复vim文档了,自己通过命令
:help cscope
去详细学习吧。
比较遗憾的是,cscope的最后一次更新是在2003年,这个项目似乎也是被人抛弃了,希望以后能被人收养,或者和其它项目合并。
Global
Global是GNU出品的交叉索引工具,支持C, C++, Yacc, Java 和PHP4五种语言,命令行下表现不错,但是和vim配合使用,就不如前面两个更加亲切了。其特色在于分析得很细腻,还能生成交叉索引的web页,很适合用来做程序的文档。
LXR
Lxr是专门用来生成程序源码的交叉索引的web界面的工具,相比Global似乎更加专一,专业。著名的网上linux源码阅读站点 http://lxr.linux.no/就是用它生成的,所以品质可略见一斑。
KScope
KScope是cscope的图形前端,他为那些不熟悉vim或者是不习惯终端作业的人提供了图形界面的选择,界面和source insight有些相近,从windows转过来做Linux开发的人可能感觉比较亲切。另外,它还有个比较迷人的特点:能生成函数调用树。
个人建议:
vim+ctags,如果是C语言,用cscope作为补充,大型项目,也可再次让global介入。
/
这两天看到网上有将vim 改造成功能强大的IDE的blog,突然心血来潮,亲身经历了一下。
网友的帖子都不错,我这里只是将各种插件分开罗列,然后加上一些使用技巧。
希望本文对你有所帮助!
『插件介绍』
Ctags工具是用来遍历源代码文件生成tags文件,这些tags文件能被编辑器或其它工具用来快速查找定位源代码中的符号(tag/symbol),如变量名,函数名等。比如,tags文件就是Taglist和OmniCppComplete工作的基础。
『下载和安装』
一、我是使用apt-get安装的:
sudo apt-get install ctags
二、下载源码安装(网上提供的方法)
1)从http://ctags.sourceforge.net/下载源代码包后,解压缩生成源代码目录,
2)然后进入源代码根目录执行./configure,
3)然后执行make,
4)编译成功后执行make install。
『基本功能使用方法』常用命令列表:
1. $ ctags –R * ($ 为Linux系统Shell提示符)
2. $ vi –t tag (请把tag替换为您欲查找的变量或函数名)
3. :ts (ts 助记字:tags list, “:”开头的命令为VI中命令行模式命令)
4. :tp (tp 助记字:tags preview)
5. :tn (tn 助记字:tags next)
6. Ctrl + ]
7. Ctrl + T
命令解释:
“$ ctags –R *”:“-R”表示递归创建,也就包括源代码根目录(当前目录)下的所有子目录。“*”表示所有文件。这条命令会在当前目录下产生一个“tags”文件,当用户在当前目录中运行vi时,会自动载入此tags文件。
Tags文件中包括这些对象的列表:
- 用#define定义的宏
- 枚举型变量的值
- 函数的定义、原型和声明
- 名字空间(namespace)
- 类型定义(typedefs)
- 变量(包括定义和声明)
- 类(class)、结构(struct)、枚举类型(enum)和联合(union)
- 类、结构和联合中成员变量或函数
VIM用这个“tags”文件来定位上面这些做了标记的对象。
剩下的命令就是定位这些对象的方法:
“$ vi –t tag” :在运行vim的时候加上“-t”参数,例如:
[/usr/src]$ vim -t main
这个命令将打开定义“main”(变量或函数或其它)的文件,并把光标定位到这一行。
如果这个变量或函数有多处定义,在VI命令行模式
“:ts”命令就能列出一个列表供用户选择。
“:tp”为上一个tag标记文件,
“:tn”为下一个tag标记文件。当然,若当前tags文件中用户所查找的变量或函数名只有一个,“:tp,:tn”命令不可用。
最方便的方法是把光标移到变量名或函数名上,然后按下“Ctrl+]”,这样就能直接跳到这个变量或函数定义的源文件中,并把光标定位到这一行。用“Ctrl+t”可以退回原来的地方。即使用户使用了N次“Ctrl+]”查找了N个变量,按N次“Ctrl+t”也能回到最初打开的文件,它会按原路返回 。
更多功能通过命令man ctags或在Vim命令行下运行help ctags查询。
注意:运行vim的时候,必须在“tags”文件所在的目录下运行。否则,运行vim的时候还要用“:settags=”命令设定“tags”文件的路径,这样vim才能找到“tags”文件。
在完成编码时,可以手工删掉tags文件(帚把不到,灰尘不会自己跑掉^_^)。
『阅读说明』
1)Vim存在多个配置文件vimrc,比如/etc/vimrc,此文件影响整个系统的Vim。还有~/.vimrc,此文件只影响本用户的Vim。而且~/.vimrc文件中的配置会覆盖/etc/vimrc中的配置。这里我们只修改~/.vimrc文件。
2)Vim的插件(plugin)安装在Vim的runtimepath目录下,你可以在Vim命令行下运行"set rtp“命令查看。这里我们选择安装在~/.vim目录,没有就创建一个。
3)当本文说”在Vim命令行下运行cmdxx命令“时,意思是指在Vim的命令行模式下运行cmdxx命令,即在Vim的正常模式下通过输入冒号":"进入命令行模式,然后紧接着输入命令cmdxx。在后文描述中都会省略冒号":"输入。
4)如果没有说明“在Vim命令行下运行某命令”,则是在shell中执行该命令。
5)如果命令中间被空白符间隔或有与正文容易混淆的字符,我会用双引号将命令与正文区分。所以读者在实际操作时,不要输入命令最前面和最后面引号。
6)本文关于组合快捷键的描述,形如a-b形式的快捷键表示同时按下a键和b键,而形如"a-b c"形式的快捷键,则表示先同时按下a键和b键,然后放开ab键,再按下c键。
7) 本人使用的系统是Ubunt 11.10 ,Vim版本是Vi IMproved 7.3
1. 安装 cscope,
http://cscope.sourceforge.net/
################################################################################################
1. 在Android源码顶层目录下运行ctags -R 生成tags文件
2. 在Android源码顶层目录运行cscope -Rbq,生成cscope.out文件
3.修改~/.vimrc使之可以自动加载tags和cscope.out文件,注意要使用ctags和cscope数据库,必须在android源码顶层运行vim程序
我的.vimrc如下:
"开关tag窗口
nnoremap <silent> <F8> :TlistToggle<CR>
"使用右侧tag窗口
"let Tlist_Use_Right_Window=1
"一般设置.
"set nocompatible "VIM而不是VI
set history=50 "历史记录50条
set fenc=utf-8 "设置默认语言为8位unicode
"man Q gq "屏蔽Q, 以免进入Ex模式
filetype on "打开文件类型检测
"
""颜色设置.
colorscheme delek "主题
"colorscheme evening "主题
syntax on "语法高亮
"set hls " 查找文本高亮
"界面设置.
set ruler "显示当前位置
set number "显示行号
""set nonumber "不显示行号
"格式设置.
set autoindent "自动缩进
set smartindent "智能缩进
set cindent "C缩进
set tabstop=4 "硬TAB
set softtabstop=4 "软TAB
set shiftwidth=4 "缩进空格数
set expandtab "空格替换TAB
"set smarttab "智能TAB
"
set showmatch "显示匹配
"set matchtime=5 "1/10秒延迟
"set hlsearch "高亮搜索
"set incsearch "搜索中匹配
set tags=tags; "ctags
"set autochdir "ctags
4.但是这样有个问题就是每次必须从android顶层运行vim,从子目录中运行ctags和cscope无法正常使用。因此我写了一个脚本,用来解决这个问题
#! /bin/bash
i=`pwd`
cd ~/source/unicore_src
vim $i/$1 $2 $3
cd $i
保存成mvim可执行文件,放到PATH环境变量中,就可以在子目录中通过mvim来打开android源码,并进行各种跳转了。
使用cscope的最大好处是可以替代source insight的功能,并可以快速定位某个函数在哪些地方被调用,非常方便
使用Vim+Ctags+Cscope阅读源代码
对于学习Linux内核的人来说,源代码的阅读尤为重要。因为所有设计思想、内部机制都是
以代码的形式实现,所有的资料也都是为了更好的诠释代码。那么一个好的阅读工具,能
够提高阅读的效率和效果。常见的代码阅读工具有,Source Navigator、Source Insight
、lxr、Cscope、Kscope等。
• &quot;Source Navigator&quot;是红帽子公司的,以GNU GPL发布,可从官方网站[1]下载使用。
• &quot;Source Insight&quot;目前只有Windows平台的,官方网站[2]。需要注册才能使用,或者
从网上下载注册机生成注册码。在Linux下通过wine模拟虽然可以方便使用,但它毕竟
是Windows平台的东西,并不能很自由的使用。
• lxr(linux cross reference)[3]为程序源代码建立索引数据库,利用perl脚本CGI动态
生成包含源码的web页面,你可以用任何一种浏览器查阅。缺点是需要服务器支持,还
有速度。
• &quot;Cscope&quot;[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中添加一行 &quot;syntax on&quot; 这样在vim中打开的源码就有了语法高亮显示。
vim自带了很多颜色主题,可以直接选取下面一行添加到vim配置文件当中,重新打开vim即
可生效。
colorscheme elflord &quot;我使用这个
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即可。
##########################################################################################