Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1675036
  • 博文数量: 311
  • 博客积分: 7778
  • 博客等级: 少将
  • 技术积分: 4186
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-09 19:59
个人简介

蓝点工坊(http://www.bluedrum.cn) 创始人,App和嵌入式产品开发。同时也做相应培训和外包工作。 详细介绍 http://pan.baidu.com/s/1y2g88

文章存档

2012年(3)

2011年(115)

2010年(170)

2009年(23)

分类: LINUX

2011-09-11 22:33:22

Andrew Huang 转载请注明作者及联络方式

我个人比较喜欢用Source Insight经过samba 的查看Linux下的内核源码,但很多情况下,是是一台纯粹的Linux主机,虽然可以用Wine上直接安装Source Insight.但教学时很多学员还是习惯用vim,所以我还是试着用这种方法查看Linux内核源码.
  关于source insight 在wine的安装,请参看我的博文


<>

 cscope 也类以的一个命令行工具。它先要创建一个项目的数据库,然后在编辑源码时可以用cs的命令或快捷键来查看宏,结构和函数的定义。

 使用cscope需要安装ctags,最好也有taglist .关于这个两个软件使用,请参考
  <>

 一.安装cscope 

   RHEL已经安装这个软件,可以运行 cscope --version 来检测
     
  1. cscope --version
  2. 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 创建数据库
      这几个选项含义如下
   
  1. [root@gz cscope]# cscope -h
  2. Usage: cscope [-bcCdehklLqRTuUvV] [-f file] [-F file] [-i file] [-I dir] [-s dir]
  3. [-p number] [-P path] [-[0-8] pattern] [source files]
  4. -b Build the cross-reference only.
  5. -C Ignore letter case when searching.
  6. -c Use only ASCII characters in the cross-ref file (don't compress).
  7. -d Do not update the cross-reference.
  8. -e Suppress the -e command prompt between files.
  9. -F symfile Read symbol reference lines from symfile.
  10. -f reffile Use reffile as cross-ref file name instead of cscope.out.
  11. -h This help screen.
  12. -I incdir Look in incdir for any #include files.
  13. -i namefile Browse through files listed in namefile, instead of cscope.files
  14. -k Kernel Mode - don't use /usr/include for #include files.
  15. -L Do a single search with line-oriented output.
  16. -l Line-oriented interface.
  17. -num pattern Go to input field num (counting from 0) and find pattern.
  18. -P path Prepend path to relative file names in pre-built cross-ref file.
  19. -p n Display the last n file path components.
  20. -q Build an inverted index for quick symbol searching.
  21. -R Recurse directories for files.
  22. -s dir Look in dir for additional source files.
  23. -T Use only the first eight characters to match against C symbols.
  24. -U Check file time stamps.
  25. -u Unconditionally build the cross-reference file.
  26. -v Be more verbose in line mode.
  27. -V Print the version number.
 
如果手工来建立files文件基本不可能,文件太多了,所以我一般用如下脚本来创建内核索引库
如果用于你的机器,你需要修改KER_PRJ (cscope项目目录) 和 KERNDIR (内核源码目录)

这个脚本内容如下
  1. #!/bin/sh
  2. KERNDIR=/home/hxy/linux-2.6.28_smdk6410
  3. CS_PRJ=/home/hxy/cscope
  4. KER_PRJ=$CS_PRJ/linux-2.6.28
  5. #if [ -ne $KER_PRJ ] ; then
  6. #mkdir -p $KER_PRJ
  7. #endif
  8. find $KERNDIR/mm/* $KERNDIR/init/* \
  9. $KERNDIR/ipc/* $KERNDIR/net/* $KERNDIR/include/linux/* \
  10. $KERNDIR/arch/arm/boot/* $KERNDIR/arch/arm/common/* $KERNDIR/arch/arm/include/* \
  11. $KERNDIR/arch/arm/mach-s3c6410/* $KERNDIR/arch/arm/mach-s3c6410/* $KERNDIR/arch/arm/plat-s3c64xx/* \
  12. $KERNDIR/arch/arm/mm/* $KERNDIR/arch/arm/plat-s3c/* \
  13. -name "*.[chxsS]" >$KER_PRJ/cscope.files
  14. cd $KER_PRJ
  15. cscope -b -q -k
  16. cd $CS_PRJ


 三.在vim中使用 cscope  

    首先如果在VIM使用内核源码可以用 cs add 命令来加载源码数据库
     我在~/.vimrc 中增加如下一段

  1. if has("cscope") && filereadable("/usr/bin/cscope")
  2. set csprg=/usr/bin/cscope
  3. set csto=0
  4. set cst
  5. set nocsverb
  6. " add any database in current directory
  7. if filereadable("cscope.out")
  8. cs add cscope.out
  9. " else add database pointed to by environment
  10. elseif $CSCOPE_DB != ""
  11. cs add $CSCOPE_DB
  12. endif
  13. cs add /home/hxy/cscope/linux-2.6.28/cscope.out
  14. set csverb
  15. endif
    cscope来提供多个命令来查询各种定义.
    主要用 cs find
    其中选项有,比如c是查找调用函数定义,如果不确定,可以直接用g选项
      
  1. : cs find s ---- 查找C语言符号,即查找函数名、宏、枚举值等出现的地方
  2. :cs find g ---- 查找函数、宏、枚举等定义的位置,类似ctags所提供的功能
  3. :cs find d ---- 查找本函数调用的函数
  4. :cs find c ---- 查找调用本函数的函数
  5. :cs find t: ---- 查找指定的字符串
  6. :cs find e ---- 查找egrep模式,相当于egrep功能,但查找速度快多了
  7. :cs find f ---- 查找并打开文件,类似vim的find功能
  8. :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) |
给主人留下些什么吧!~~