Andrew Huang 转载请注明作者及联络方式
我个人比较喜欢用Source Insight经过samba 的查看Linux下的内核源码,但很多情况下,是是一台纯粹的Linux主机,虽然可以用Wine上直接安装Source Insight.但教学时很多学员还是习惯用vim,所以我还是试着用这种方法查看Linux内核源码.
关于source insight 在wine的安装,请参看我的博文
cscope 也类以的一个命令行工具。它先要创建一个项目的数据库,然后在编辑源码时可以用cs的命令或快捷键来查看宏,结构和函数的定义。
使用cscope需要安装ctags,最好也有taglist .关于这个两个软件使用,请参考
<>
一.安装cscope
RHEL已经安装这个软件,可以运行 cscope --version 来检测
- cscope --version
-
cscope: version 15.5
如果没有安装,可到 ,
并且下载vim的插件代码,这里主要是定义了一些快捷方式
这里插件要拷贝到 /usr/share/vim/vim70/plugin/ 当中
安装成功后,可以在vim中运行命令
cs help
如果能查看结果表示安装成功
二.创建cscope 数据库
cscope主要靠检索自己的索引库来查找定义,因此需要检索内核源码定义,必须首先用cscope建立一个针对内核的数据库,名字一般叫 cscope.out
我把所有cscope的数据库,集中放在/home/hxy/cscope 之下,每一个项目为一个单独子目录。我要查看ARM-Linux的 2.6.28的源码,就建立了/home/hxy/cscope/linux-2.6.28 目录。
cscope 首先需要一个文件列表,这个列表名称一般取名为cscope.files.
然后调用 cscope -b -q -k 创建数据库
这几个选项含义如下
- [root@gz cscope]# cscope -h
-
Usage: cscope [-bcCdehklLqRTuUvV] [-f file] [-F file] [-i file] [-I dir] [-s dir]
-
[-p number] [-P path] [-[0-8] pattern] [source files]
-
-
-b Build the cross-reference only.
-
-C Ignore letter case when searching.
-
-c Use only ASCII characters in the cross-ref file (don't compress).
-
-d Do not update the cross-reference.
-
-e Suppress the -e command prompt between files.
-
-F symfile Read symbol reference lines from symfile.
-
-f reffile Use reffile as cross-ref file name instead of cscope.out.
-
-h This help screen.
-
-I incdir Look in incdir for any #include files.
-
-i namefile Browse through files listed in namefile, instead of cscope.files
-
-k Kernel Mode - don't use /usr/include for #include files.
-
-L Do a single search with line-oriented output.
-
-l Line-oriented interface.
-
-num pattern Go to input field num (counting from 0) and find pattern.
-
-P path Prepend path to relative file names in pre-built cross-ref file.
-
-p n Display the last n file path components.
-
-q Build an inverted index for quick symbol searching.
-
-R Recurse directories for files.
-
-s dir Look in dir for additional source files.
-
-T Use only the first eight characters to match against C symbols.
-
-U Check file time stamps.
-
-u Unconditionally build the cross-reference file.
-
-v Be more verbose in line mode.
-
-V Print the version number.
如果手工来建立files文件基本不可能,文件太多了,所以我一般用如下脚本来创建内核索引库
如果用于你的机器,你需要修改KER_PRJ (cscope项目目录) 和 KERNDIR (内核源码目录)
这个脚本内容如下
- #!/bin/sh
-
-
KERNDIR=/home/hxy/linux-2.6.28_smdk6410
-
-
CS_PRJ=/home/hxy/cscope
-
KER_PRJ=$CS_PRJ/linux-2.6.28
-
-
#if [ -ne $KER_PRJ ] ; then
-
#mkdir -p $KER_PRJ
-
#endif
-
-
find $KERNDIR/mm/* $KERNDIR/init/* \
-
$KERNDIR/ipc/* $KERNDIR/net/* $KERNDIR/include/linux/* \
-
$KERNDIR/arch/arm/boot/* $KERNDIR/arch/arm/common/* $KERNDIR/arch/arm/include/* \
-
$KERNDIR/arch/arm/mach-s3c6410/* $KERNDIR/arch/arm/mach-s3c6410/* $KERNDIR/arch/arm/plat-s3c64xx/* \
-
$KERNDIR/arch/arm/mm/* $KERNDIR/arch/arm/plat-s3c/* \
-
-name "*.[chxsS]" >$KER_PRJ/cscope.files
-
-
cd $KER_PRJ
-
-
cscope -b -q -k
-
-
cd $CS_PRJ
三.在vim中使用 cscope
首先如果在VIM使用内核源码可以用 cs add 命令来加载源码数据库
我在~/.vimrc 中增加如下一段
- if has("cscope") && filereadable("/usr/bin/cscope")
-
set csprg=/usr/bin/cscope
-
set csto=0
-
set cst
-
set nocsverb
-
" add any database in current directory
-
if filereadable("cscope.out")
-
cs add cscope.out
-
" else add database pointed to by environment
-
elseif $CSCOPE_DB != ""
-
cs add $CSCOPE_DB
-
endif
-
cs add /home/hxy/cscope/linux-2.6.28/cscope.out
-
set csverb
-
endif
cscope来提供多个命令来查询各种定义.
主要用 cs find
其中选项有,比如c是查找调用函数定义,如果不确定,可以直接用g选项
- : cs find s ---- 查找C语言符号,即查找函数名、宏、枚举值等出现的地方
- :cs find g ---- 查找函数、宏、枚举等定义的位置,类似ctags所提供的功能
- :cs find d ---- 查找本函数调用的函数
- :cs find c ---- 查找调用本函数的函数
- :cs find t: ---- 查找指定的字符串
- :cs find e ---- 查找egrep模式,相当于egrep功能,但查找速度快多了
- :cs find f ---- 查找并打开文件,类似vim的find功能
- :cs find i ---- 查找包含本文件的文件
如:
cs find -g module_init
cs的插件定义一些快捷操作,更加方便的cs的使用, 这一些快捷键是按
ctrl-\ 或 ctrl-@ (即2键) 加上选项字符,便是对当前光标所在单词进行检索
在我这里的环境,开始快捷键和查找总是失败,必须先在命令行窗口运行一次
cs reset 才能正常工作
ctrl-\ <选项> 是查找当前单词的定义,并且在当前窗口显示.
如 (ctrl-\)g 是查找定义
ctrl-@ <选项> 是查找当前单词的定义,并且打开一个水平窗口显示.
这里找到结果的显示界面,这里我是查找readl定义
这里显示有两个结果,可以输入相关数字跳到相关文件.
如果用ctrl-\ 查找,结果直接跳到相关文件,并有当前窗口显示.
如果用ctrl-@来查找,则显示一个水平窗口显示结果
在查找结果中处理的快捷键:
ctrl-T 返回上次调用的地方
ctrl-] 显示光标处单词的检索列表
ctrl-[ 关闭检索列表
ctrl-F 返回上一次修改处
ctrl-B 跳入前一次修改处(ctrl-F相反方向)
三.常见问题处理
cs 查找不到结果,并建议重置连接,可能需要cs reset重置一下联接
taglist 滚动后发生乱屏,它正常显示需要UTF-8字体
在图形界面下的终端的VIM使用cscope。出现cs find 可以用,但是快捷键不能用的情况,这个主要是终端的类型不对,在RHEL5下的不能配置成Linux终端,必须配置成Xterm 终端快捷键才有响应。
阅读(3230) | 评论(0) | 转发(1) |