在大项目中使用,CTAGS_安装配置及简单使用

2019-07-19 作者:yzc216亚洲城   |   浏览(180)

如果你要涉及一个大的代码库,Cscope 会是一个非常有用的工具. 它可以通过快速、有目的的搜索为你节省很多时间,而不是像 grep 那样随机的对源文件手动搜索(对于大的代码库,grep 需要一段时间才能启动).

Vim的简单配置

在这个教程中,你将学会如何针对一个大项目来设置 Cscope. 我们用到的例子是 Linux 内核源代码, 基本的步骤和其他大项目是一样的, 包括 C 和 JAVA 项目.

cscope在sourceforge的主页中有vim中使用cscope的方法,同时给出了一个vim的配置文件,或者执行sudo apt-get install cscope

1.获取源代码. 首先要获取源代码. 可以从 下载内核源代码. 本教程中假设你下载的是 Linux 2.4.18 并且安装在 /home/jru/linux-2.4.18.

在cscope界面中查询:

注意: 确保你有足够的磁盘空间: 内核压缩包只有 30 MB, 解压后会的源代码是 150 MB , 生成的 Cscope 数据库会占用额外的 20-100 MB (这取决于你想要数据库包含多少内核代码). 有必要的话,可以把源代码和 Cscope 数据库放在两个不同的磁盘分区 .

在解压的内核源代码根目录中进行:

2.弄清楚你想要把 Cscope 数据库文件放在哪里. 我假设你会在 /home/jru/cscope 存放数据库和关联文件.

ctags –R 生成tags文件,在执行cscope –R ,生成cscope.out数据库文件并进入cscope界面。

3.生成一个带有浏览文件列表的 cscope.files . 对于某些项目, 你可能想要在 Cscope 数据库中包含项目目录中的所有 C 源文件. 这种情况下可以跳过这一步, 只需在项目的顶层目录上执行 'cscope -R' 来构建你的 Cscope 数据库. 但是如果有些代码你不想包含, 或者你的项目包含 C 或 JAVA 源代码 (Cscope 默认只能解析 .c, .h, .y, 或 .l 文件), 就要生成一个 cscope.files 文件, 其中包含了想要 Cscope 扫描的所有文件名 (每个文件名占一行).

在menu处也就是提示按什么方式查询的地方按下 问号 (?)给出提示

你有可能用到绝对路径 (至少在编辑器里使用 Cscope 数据库时需要), 这样www.linuxidc.com就可以在你创建的目录之外使用数据库. 我展示的命令会先进入根目录, 这样就可以用 find 打印出绝对路径.

 

对于很多项目, find 命令可以这样用:

已经生成了tags和cscope.out文件后,不想再cscope界面中查询,而是直接在vim中调用cscope.out和ctags文件也可以,但是必须保证vim打开的文件同一个目录中有ctags和cscope.out文件。Ctags和cscope使用方法如下:

cd /

VIM使用cscope查找

find /my/project/dir -name '*.java' >/my/cscope/dir/cscope.files

1,加载cscope.out文件

对于 Linux 内核, 就有点棘手, 因为我们想要排除文档和脚本目录下的代码, 还有除 Intel x86 外的所有芯片和体系结构的汇编代码(我想你的体系结构是 X86). 另外, 本例中我会排除所有的内核驱动代码 (这些代码超过要解析的代码总量的两倍, 会导致 Cscope 数据库膨胀, 并且包含了很多重复的定义, 通常更难搜素. 如果你对驱动代码感兴趣, 可以省略下面相关的行, 或者修改为只输出你感兴趣的驱动文件):

在VIM中使用cscope非常简单,首先调用“cscope add”命令添加一个cscope数据库,然后就可以调用“cscope find”命令进行查找了。VIM支持8种cscope的查询功能,如下:例如,我们想在代码中查找调用work()函数的函数,我们可以输入:“:cs find c work”,回车后发现没有找到匹配的功能,可能并没有函数调用work()。我们再输入“:cs find s work”,查找这个符号出现的位置,现在vim列出了这个符号出现的所有位置。我们还可以进行字符串查找,它会双引号或单引号括起来的内容中查找。还可以输入一个正则表达式,这类似于egrep程序的功能。

LNX=/home/jru/linux-2.4.18

在源代码目录下打开vim。要使用cscope查找就必须加载cscope.out文件.在vim命令行下执行:

cd /

:cs add cscope.out

find  $LNX                                                               

在vim命令行下执行:

-path "$LNX/arch/*" ! -path "$LNX/arch/i386*" -prune -o              

:cs help

-path "$LNX/include/asm-*" ! -path "$LNX/include/asm-i386*" -prune -o

cscope commands:

-path "$LNX/tmp*" -prune -o                                          

add  : Add a new database             (Usage: add file|dir [pre-path] [flags])

-path "$LNX/Documentation*" -prune -o                                

find : Query for a pattern            (Usage: find c|d|e|f|g|i|s|t name)

-path "$LNX/scripts*" -prune -o                                      

       c: Find functions calling this function

-path "$LNX/drivers*" -prune -o                                      

       d: Find functions called by this function

-name "*.[chxsS]" -print >/home/jru/cscope/cscope.files

       e: Find this egrep pattern

这里用到了find 命令, 在大项目中,这样做比手动编辑一个文件列表容易多了, 也可以从其他地方复制一个.

       f: Find this file

图片 1

       g: Find this definition

       i: Find files #including this file

       s: Find this C symbol

       t: Find assignments to

help : Show this message              (Usage: help)

kill : Kill a connection              (Usage: kill #)

reset: Reinit all connections         (Usage: reset)

show : Show connections               (Usage: show)

s:查找C语言符号,即查找函数名、宏、枚举值等出现的地方

g:查找函数、宏、枚举等定义的位置,类似ctags所提供的功能

d:查找本函数调用的函数

c:查找调用本函数的函数

t:查找指定的字符串

e:查找egrep模式,相当于egrep功能,但查找速度快多了

f:查找并打开文件,类似vim的find功能

i:查找包含本文件的文

当然在底行模式下介键入 help 会弹出 vim的帮助。

2,使用cscope查找do_fork函数的定义:

在vim命令行下执行:

:cs f g do_fork

就可以查看do_fork的全局定义了。

cscope常用快捷键:

先按 ctrl 然后 再按以下键: 

1.                   c: 查找该函数被调用的位置  

2.                   d: 查找该函数调用了哪些函数  

 

3.                   e: 查找指定的正规表达式 f: 查找指定的文件  

4.                   g: 查找指定标识符的定义位置  

5.                   i: 查找该文件在哪些地方被包含  

6.                   s: 查找指定标识符的使用位置  

7.                 t: 查找指定的文本字符串  

 

在VIM中使用tags查找

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

某个函数有多个定义时

:tag

跳到第一个定义处,优先跳转到当前文件
:tnext
跳到第一个
:tfirst

跳到前count个

:[count]tpreviouss

跳到后count个

:[count]tnext
跳到最后一个
:tlast

你也可以在所有tagname中选择:
:tselect tagname

关于tags的其它用法可以在vim中执行”:help tags”命令进行查询。

在安装了cscope和ctags的情况下,以下命令特别好使,他们现在cscope.out 数据库中查找,若没有则在ctags中查找

ctrl ]:在函数调用的地方跳转到函数定义的地方

ctrl t:返回上一个查找的地方

 

 

 

首先在目录下建立cscope索引文件

find -name '*.c' > cscope.file

cscope -Rbkq

这个命令会生成三个文件:cscope.out, cscope.in.out, cscope.po.out。

其中cscope.out是基本的符号索引,后两个文件是使用"-q"选项生成的,可以加快cscope的索引速度。

上面所用到的命令参数,含义如下:

-R: 在生成索引文件时,搜索子目录树中的代码
-b: 只生成索引文件,不进入cscope的界面
-k: 在生成索引文件时,不搜索/usr/include目录
-q: 生成cscope.in.out和cscope.po.out文件,加快cscope的索引速度

 

如果只希望 Cscope 关联起所有的 .c 文件,那么可以直接到工程的根目录下,输入:
$ cscope -Rbq
-R 表示递归地把所有子文件夹中的 source file 也关联进来
-b 表示只建立数据库文件 cscope.out,不进入 Cscope 的 GUI 界面
-q 会建立两个额外的 'inverted index' file: cscope.in.out 和 cscope.po.out,以加快查找的速度
如果不希望把 /usr/include 中被工程文件包含的 .h 文件关联进来,就加 -k

如果要关联其他类型的文件(如 .cpp、.java等),就需要我们自己先生成一个 cscope.files,把所有我们希望关联进去的文件都列在里面:
$ find /home/edelweiss/nbd/nbd-2.9.15/ -name '*.c' -o -name '*.cpp' -o -name '*.h'
> /home/edelweiss/cscope.files

注意查找的路径一定要写成绝对路径,这样才能保证写入到 cscope.files 文件中的也是绝对路径。
之后就可以根据 cscope.files 建立数据库了:
$ cscope -bq -i /home/edelweiss/cscope.files

 

ctag 和 cscope 的使用

都要在当前目录下,即你要查找的代码目录下。

ctag使用:

    命令:ctags –R 生成tags文件

Cscope使用:

    命令:find -name '*.c' -o -name '*.h' -o -name '*.cpp'>cscope.file

         cscope  -Rbkq

         在源代码文件中:vim命令进入后执行

           :cs add cscope.out

只能在当前目录下使用vim命令时实现函数跳转(有cscope.out的目录)

 

Vim 命令打开的文件,显示的时候分屏命令:

水平分屏命令为(:sp 文件路径和文件名)

垂直分屏命令为(:vs  文件路径和文件名)

本文由yzc216亚洲城发布于yzc216亚洲城,转载请注明出处:在大项目中使用,CTAGS_安装配置及简单使用

关键词: yzc216亚洲城