cscope应用

1.
http://docs.sun.com/source/806-3567/cscope.html
Chapter 9
cscope: Interactively Examining a C Program



2.
http://people.upsdn.net/tutorials/vim/if_cscop.html
http://vimcdoc.sourceforge.net/doc/if_cscop.html#cscope-intro
*if_cscop.txt*  For Vim version 6.4.  最近更新:2006年2月
                  VIM REFERENCE MANUAL    by Andy Kahn
                译者:lang2 http://vimcdoc.sf.net
                                                        *cscope* *Cscope*
本文档阐述如何使用 Vim 的 cscope 接口。
Cscope 是一个类似 ctags 的工具。 你可以把它想作是超过频的 ctags,因为它功能比
ctags 强大很多。 在 Vim 里,通过 cscope 查询结果来跳转就象跳转到其他的标签完
全一样; 它被保存在标签堆栈里。这样你就可以象使用 |tags| 一样在函数等等之间便捷
的跳转。
1. Cscope 简介                        |
cscope-intro
|
2. Cscope 相关命令          |
cscope-commands
|
3. Cscope 选项                        |
cscope-options
|
4. 如何在 Vim 中使用 cscope       |
cscope-howtouse
|
5. 缺陷                               |
cscope-limitations
|
6. 建议的使用方法                |
cscope-suggestions
|
7. 如何获取 cscope 等等           |
cscope-info
|
到目前为止 cscope 接口仅在 Unix 及 Win32 平台下有效。
{Vi does not have any of these commands}
1. Cscope 简介                                                *cscope-intro*
下面文本摘自 cscope 的手册页:
  Cscope 是一个交互式的屏幕下使用的工具,用来帮助你:
       无须在厚厚的程序清单中翻来翻去就可以认识一个 C 程序的工作原理。
       无须熟悉整个程序就可以知道清楚程序 bug 所要修改的代码位置。
       检查提议的改动 (如添加一个枚举值) 可能会产生的效果。
       验证所有的源文件都已经作了需要的修改;例如给某一个现存的函数添加
       一个参数。
       在所有相关的源文件中对一个全局变量改名。
       在所有相关的位置将一个常数改为一个预处理符号。
  它被设计用来回答以下的问题:
       什么地方用到了这个符号?
       这是在什么地方定义的?
       这个变量在哪里被赋值?
       这个全局符号的定义在哪里?
       这个函数在源文件中的那个地方?
       那些函数调用了这个函数?
       这个函数调用了那些函数?
       信息 "out of space" 从哪来?
       这个源文件在整个目录结构中处于什么位置?
       哪些文件包含这个头文件?
  Cscope 在第一次被使用在指定的源文件时会建立一个符号的数据库。接下来被调
  用时,cscope 仅仅重建那些被改动或者新文件相关的数据库。那些没有被改动的
  文件相关的数据库会被直接复制使用。这是的重建数据库要比第一次运行快许多。
当 cscope 被一般的调用时,你会得到一个全屏幕的选择窗口。你可以输入以上
问题中的一个。然而,一旦找到一个匹配你必须进入一个文本编辑器来查看和编辑
匹配的文本。你无法象在 vi 中使用 Ctrl-] 或 :tag 命令那样方便的跳转。
Vim 的 cscope 接口的工作原理是:先调用 cscope 的命令行接口,然后分析其
输出结果从而找到匹配处。最终结果是:cscope 查询结果就象一般的标签一样。
你可以使用一般的标签命令 (Ctrl-] 或 :tag) 然后再用 Ctrl-T 回跳。
(注意 不过,其实你不能简单的就使用 Ctrl-] 或 :tag 来跳转到标签。在那之前
你必须重新定义映射或设定一些选项值。下面的几节会告诉你如何正确的使用
cscope 接口)
2. Cscope 相关命令                                  *cscope-commands*
                *:cscope* *:cs* *:scs* *:scscope* *E259* *E262* *E561* *E560*
所有命令都是通过主命令 ":cscope" 的子项完成的。主命令最短的缩写是 ":cs"。
":scscope" 完成同样的功能的同时还可以分割窗口 (缩写: "scs").
可用的子命令有:
                        *E563* *E564* *E566* *E568* *E569* *E622* *E623*
                        *E625* *E626* *E609*
    add   : 添加一个新的 cscope 数据库/连接。
        用法  :cs add {file|dir} [pre-path] [flags]
            [pre-path] 用来通知 cscope 使用 -P [pre-path] 选项。
            [flags] 可以用来给 cscope 传递额外的选项。
        例子
            :cscope add /usr/local/cdb/cscope.out
            :cscope add /projects/vim/cscope.out /usr/local/vim
            :cscope add cscope.out /usr/local/vim -C
                                      *cscope-find* *cs-find*
                                                *E565* *E567*
    find  : 查询 cscope。除了第 5 个之外的所有 cscope 查询功能都
            可以使用。第 5 个是 "Change this grep pattern"。
        用法  :cs find {querytype} {name}
            {querytype} 和 cscope 的控制台界面以及 nvi 缺省命令
            都是一致的。
                0 或 s: 查找 C 符号
                1 或 g: 查找定义
                2 或 d: 查找本函数调用的函数
                3 或 c: 查找调用指定函数的函数
                4 或 t: 查找字符串
                6 或 e: 查找 egrep 模式
                7 或 f: 查找文件
                8 或 i: 查找包含指定文件的文件
        例如
            :cscope find c vim_free
            :cscope find 3 vim_free
            这两个例子执行同样的查询。
            :cscope find 0 DEFAULT_TERM
            在 Vim 5.1 的源代码内执行以上的命令得到以下的结果:
            Cscope tag: DEFAULT_TERM
               #   line  filename / context / line
               1   1009  vim-5.1-gtk/src/term.c >
                         #define DEFAULT_TERM (char_u *)"amiga"
               2   1013  vim-5.1-gtk/src/term.c >
                         #define DEFAULT_TERM (char_u *)"win32"
               3   1017  vim-5.1-gtk/src/term.c >
                         #define DEFAULT_TERM (char_u *)"pcterm"
               4   1021  vim-5.1-gtk/src/term.c >
                         #define DEFAULT_TERM (char_u *)"ansi"
               5   1025  vim-5.1-gtk/src/term.c >
                         #define DEFAULT_TERM (char_u *)"vt52"
               6   1029  vim-5.1-gtk/src/term.c >
                         #define DEFAULT_TERM (char_u *)"os2ansi"
               7   1033  vim-5.1-gtk/src/term.c >
                         #define DEFAULT_TERM (char_u *)"ansi"
               8   1037  vim-5.1-gtk/src/term.c >
                         # undef DEFAULT_TERM
               9   1038  vim-5.1-gtk/src/term.c >
                         #define DEFAULT_TERM (char_u *)"beos-ansi"
              10   1042  vim-5.1-gtk/src/term.c >
                         #define DEFAULT_TERM (char_u *)"mac-ansi"
              11   1335  vim-5.1-gtk/src/term.c >
                         term = DEFAULT_TERM;
              12   1459  vim-5.1-gtk/src/term.c >
                         if (STRCMP(term, DEFAULT_TERM))
              13   1826  vim-5.1-gtk/src/term.c >
                         term = DEFAULT_TERM;
              14   1833  vim-5.1-gtk/src/term.c >
                         term = DEFAULT_TERM;
              15   3635  vim-5.1-gtk/src/term.c >
                         p = find_builtin_term(DEFAULT_TERM);
            Enter nr of choice ( to abort):
            这样的输出显示了几类信息:
            1. 标签号码 (例子中有 15 个).
            2. 标签所在的行号.
            3. 标签所在文件的文件名.
            4. 标签的上下文 (如:全局或函数名).
            5. 标签所在行的文本.
    help  : 显示一个简单的帮助。
            用法    :cs help
                                                *E260* *E261*
    kill  : 终止一个 cscope 连接 (或终止所有 cscope 连接).
            用法   :cs kill {num|partial_name}
            要终止一个连接,需要给出连接号或者部分的连接名称。部分名称可以
            是数据库文件路径的任何一部分。所以要当心使用这个功能!
            如果给定的连接号是 -1,那么 所 有 的 cscope 连接都会被终止。
    reset : 重新初始化所有连接。
            用法    :cs reset
    show  : 显示当前的连接。
            用法    :cs show
                                                        *:cstag* *E257* *E562*
如果你同时使用 cscope 和 ctags, |
:cstag
| 允许你在跳转前对两者都在查询。
例如,你可以选择先查询 cscope 数据库,如果无法找到匹配,再查询标签文件。
这种做法的次序可以通过 |
csto
| 的值来调整。参见 |
cscope-options
|。
|
:cstag
| 在搜索 cscope 数据库时执行和 ":cs find g" 一样的操作。
|
:cstag
| 在搜索标签文件时执行和 |:tjump| 一样的操作。
3. Cscope 选项                                                *cscope-options*
所有 cscope 有关的选项都可以用 |:set| 命令来设定。比较理想的做法是将这些
设定添加到你的启动文件中 (如:.vimrc)。某些 cscope 选项仅仅在 |.vimrc|
文件内才有效。在 vim 启动之后再设定它们的值没有任何效果!
                                                        *cscopeprg* *csprg*
'cscopeprg' 指定用来执行 cscope 的命令。缺省值是 "cscope"。例如:
        :set csprg=/usr/local/bin/cscope
                                            *cscopequickfix* *csqf* *E469*
{not available when compiled without the |+quickfix| feature}
'cscopequickfix' 设定是否使用 quickfix 窗口来显示 cscope 结果。这是一组用
逗号分割的值。每个值可以代表一个 |
cscope-find
| 命令 (s, g, d, c, t, e, f
或 i) 加一个标志 (+, - 或 0)。
'+' 表示结果必须被添加到 quickfix 窗口中。 '-' 表示清除上次的结果,'0' 或
不存在表示不使用 quickfix。 搜索从字符串首开始直到命令第一次出现时结束。
缺省值是 "" (不使用 quickfix 窗口)。下面的值也许有用: "s-,c-,d-,i-,t-,e-"。
                                                        *cscopetag* *cst*
若设定了 'cscopetag' 选项,":tag" 命令,CTRL-] 以及 "vim -t" 都会使用
|
:cstag
| 而不是缺省的 :tag。也就是说,设定 'cst' 选项意味着你总同时搜索 cscope
数据库和标签文件。缺省值为关。例如:
        :set cst
        :set nocst
                                                        *cscopetagorder* *csto*
'csto' 的值决定 |
:cstag
| 命令查找的次序。如果 'csto' 被设为 0,cscope 数据库
先被搜索,搜索失败的情况下在搜索标记文件。如果 'csto' 被设为 1,标记文件会在
cscope 数据库之前被搜索。缺省值为 0。
例:
        :set csto=0
        :set csto=1
                                                *cscopeverbose* *csverb*
如果 'cscopeverbose' 没有被设定 (缺省情况),当添加一个数据库时,成功与否不会
被显示。理想的情况是,你先在你的 |.vimrc| 文件中复位该选项,再添加 cscope
数据库,然后再设定之。这样,如果你在使用 vim 当中动态添加数据库,你就会被 vim
告知结果。例如:
        :set csverb
        :set nocsverb
                                                      *cscopepathcomp* *cspc*
'cspc' 的值决定显示文件路径的多少部分。在缺省值 0 的情况下整个路径都会被显
示。1 只显示文件名,而不显示路径名。其它值会显示该值表示数目的部分。例如:
        :set cspc=3
会显示文件路径的最后 3 个部分,包括文件名本身。
4. 如何在 Vim 中使用 cscope                               *cscope-howtouse*
首先你要做的是为你的源文件建立一个 cscope 数据库。最简单的做法是使用
"cscope -b" 命令。更详细的说明请查阅 cscope 的手册页。
假定你已经建立了一个 cscope 数据库,你需要将其添加 "add" 到 Vim 中来。这会
建立一个 cscope "连接" 给 Vim 来使用。你可以把这些加入到你的 .vimrc 文件里。
也可以在 vim 启动之后手动完成。例如,要添加一个 cscope 数据库 "cscope.out",
你可以这样做:
        :cs add cscope.out
你可以用 ":cs show" 命令来检查一下结果。该命令会产生类似下面的结果:
# pid    database name                       prepend path
0 28806  cscope.out                          
备注:
因为 Microsoft RTL 的缺陷,Win32 版本只能显示 0 而不是真正的进程 ID。
一旦建立了 cscope 连接,你就可以做各种查询并得到结果。查询所用的命令是
":cs find"。例如:
        :cs find g ALIGN_SIZE
这样要做很多的打字工作,所以有些麻烦。幸运的是,我们可以通过定义快捷键
来避免过多的输入。参考 |
cscope-suggestions
| 可以得到一些使用的建议。
如果匹配结果只有一个,你会被自动带到该处。如果匹配结果多于一个,Vim 会显示一个
选择屏幕让你来选择一处匹配。在你跳转到新的位置后,简单的用 Ctrl-T 就可以跳会
远处。
5. 缺陷                                                       *cscope-limitations*
Vim 对 cscope 的支持仅当所在系统支持以下四个系统调用时才可用:fork(),
pipe(), execl(), waitpid()。这意味着它基本上仅限于 Unix 系统。
另外 cscope 支持在 Win32 也可以使用。更多的信息以及一个 Win32 版本的
cscope 可以在这里找到:
        http://iamphet.nm.ru/cscope/index.html
http://cscope.sourceforge.net 的 DJGPP 编译版本已知不能和 Vim 一起工作。
同时还有几个硬性的限制:
    1. cscope 的最大连接数目是 8。你还需要更多吗?
    2. 在用 |
:cstag
| 搜索时要执行 |:tjump|,这一点是无法配置的。
    (如:你不能选择使用 tselect)。
6. 建议的使用方法                                        *cscope-suggestions*
将下面的设定加入到你的 .vimrc 里 (根据你的情况调整文件路径):
        if has("cscope")
                set csprg=/usr/local/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
                set csverb
        endif
我们设定了 'cscopetag',这样所有的 :tag 命令就会实际上调用 :cstag。这包括
:tag, Ctrl-], 及 "vim -t"。结果是一般的 tag 命令不仅搜索由 ctags 产生的
标签文件,同时也搜索 cscope 数据库。
有些用户也许向保留原来的标签命令,而用另外一个快捷键来执行 :cstag 命令。
例如,你可以用下面的命令将 Ctrl-_  (下划线) 映射到 :cstag:
        map  :cstag =expand("")
常用的 cscope 查询 (用 ":cs find") 包括寻找所有调用指定函数的函数以及寻找
所有出现某个指定的 C 符号的地方。你可以参照以下的映射:
        map g :cs find 3 =expand("")
        map g :cs find 0 =expand("")
这些对 Ctrl-] (右方括号) 和 Ctrl-/ (反斜杠) 的映射使你可以将光标移动到你想
作查询的函数或 C 符号的上方然后快速的查询 cscope 数据库。
你也可以使用下面的方式。这些映射借鉴了 Cscope 主页
(http://cscope.sourceforge.net/) 上的 Vim/Cscope 教程:
        nmap s :cs find s =expand("")
        nmap g :cs find g =expand("")
        nmap c :cs find c =expand("")
        nmap t :cs find t =expand("")
        nmap e :cs find e =expand("")
        nmap f :cs find f =expand("")
        nmap i :cs find i ^=expand("")$
        nmap d :cs find d =expand("")
        " Using 'CTRL-spacebar' then a search type makes the vim window
        " split horizontally, with search result displayed in
        " the new window.
        nmap s :scs find s =expand("")
        nmap g :scs find g =expand("")
        nmap c :scs find c =expand("")
        nmap t :scs find t =expand("")
        nmap e :scs find e =expand("")
        nmap f :scs find f =expand("")
        nmap i :scs find i ^=expand("")$
        nmap d :scs find d =expand("")
        " Hitting CTRL-space *twice* before the search type does a vertical
        " split instead of a horizontal one
        nmap s
                /:vert scs find s =expand("")
        nmap g
                /:vert scs find g =expand("")
        nmap c
                /:vert scs find c =expand("")
        nmap t
                /:vert scs find t =expand("")
        nmap e
                /:vert scs find e =expand("")
        nmap i
                /:vert scs find i ^=expand("")$
        nmap d
                /:vert scs find d =expand("")
7. 如何获取 Cscope 等等                                   *cscope-info*
如果你还没有 cscope (你的编译器或 OS 没有包括 cscope),你可以从下面的地址免费
下载:
        http://cscope.sourceforge.net/
这是被 SCO 以 BSD 许可发布的。
如果你想要更新的版本,你可以购买它。根据 (旧的) nvi 文档:
        你可以用 $400 从 AT&T Software Solutions 购买无限制的许可的源码。
        致电 +1-800-462-8146。
你还可以从 World-Wide Exptools Open Sourcean 的网页下载 cscope 13.x 及
mlcscope 14.x (多语言 cscope,支持 C, C++, Java, lex, yacc, breakpoint
listing, Ingres, 及 SDL)。网址如下:
        http://www.bell-labs.com/project/wwexptools/packages.html
在 Solaris 2.x 上, 如果你有 C 编译器的许可,你也就有 cscope。两者通常位于
/opt/SUNWspro/bin
SGI 开发者也可以得到 cscope。在以下的地址搜索 cscope:
        http://freeware.sgi.com/index-by-alpha.html
        https://toolbox.sgi.com/toolbox/utilities/cscope/
第二个地址仅对那些 SGI toolbox 的拥有者有效。
网上还有一个旧版本的 cscope 的克隆 (叫 "cs") 。出于各种原因,Vim 不支持该
程序。
Vim cscope 接口/支持的原作者是 Andy Kahn 。期间使用了
nvi cscope 接口的构架和很少的一部分代码。如果你在使用 Vim cscope 接口时
有任何问题,建议,patches, 等等,请与他联系。
                                                        *cscope-win32*
这里可以找到一个 Win32 版本的 cscope://iamphet.nm.ru/cscope/index.html
Win32 支持是 Sergey Khorev  加入的。如果你有 Win32 相
关的问题,请联系他。
vim:tw=78:ts=8:ft=help:norl:3.
http://bbs.cnplmm.com/thread-121778-1-1.html
用tags/cscope看内核源代码-HOWTO
作者:wheelz
来自:
http://www.linuxforum.net/forum/ ... K&Number=573982
看大家讨论得热烈,我也写点。呵呵
其实内核原代码的Makefile就包含了make tags/TAGS的选项,
但是生成的tags太大,因为包含了drivers等不常用的目录。
因此参照内核的Makefile文件,写了一个Makefile,
用来生成ctags/cscope/etags。
这样,可以根据自己的需要,删除和添加目录。
我以前没有用过tags/cscope,不知道有没有更好的方法。欢迎指教。
也请大家补充tags/cscope的常用的和好用的命令,技巧。
一、用法
找一个空目录,把附件Makefile拷贝进去。
然后在该目录中选择性地运行如下make命令:
注:SRCDIR用来指定内核源代码目录,如果没有指定,
则缺省为/usr/src/linux/,如
$ make
将处理/usr/src/linux下的源文件,在当前目录生成ctags, cscope
1) 只创建ctags
$ make SRCDIR=/usr/src/linux-2.6.12/ tags
2) 只创建cscope
$ make SRCDIR=/usr/src/linux-2.6.12/ cscope
3) 创建ctags和cscope
$ make SRCDIR=/usr/src/linux-2.6.12/
4) 只创建etags
$ make SRCDIR=/usr/src/linux-2.6.12/ TAGS
二、处理时包括的内核源文件:
1) 不包括drivers,sound目录
2) 不包括无关的体系结构目录
3) fs目录只包括顶层目录和ext2,proc目录
对2.6.12.1内核,这样生成的tags大约12M,cscopes大约19M
三、最简单的ctags命令
----------------------
1) 进入
进入vim后,用
:tag func_name
跳到函数func_name
----------------------
2) 看函数(identifier)
想进入光标所在的函数,用
CTRL   ]
----------------------
3) 回退
回退用
CTRL   T
----------------------
我现在只会用这几个命令,请大家说说其他常用的命令。
[ 本帖最后由 leviathan.alan 于 2006-3-18 17:51 编辑 ]
Makefile.zip

leviathan.alan
回复于:2006-03-18 17:51:56

查找标识符
:tag write_
找到以write_开头的标识符,如果有多个,继续按,直到找到想要的。
如果想跳到包含block的标识符
:tag /block
然后用来选择。
这里'/'就是告诉vim'block'是一个pattern。
如果想在以write_开头的标识符中选择一下,
:tselect /^write_
这里,'^'表示开头,同理,'$'表示末尾。

leviathan.alan
回复于:2006-03-18 17:52:49

多个同名的标识符
如果某个函数有多个定义,':tag'命令会跳到第一个,如果当前文件有,则优先用这个。
然后可以跳到下一个同名的
:tnext
跳到第一个
:tfirst
跳到前count个
:[count]tprevious
跳到后count个
:[count]tnext
跳到最后一个
:tlast
你也可以在所有tagname中选择:
:tselect tagname

mingyanguo
回复于:2006-03-18 18:02:28

if has("cscope")
                set csprg=/usr/local/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
map  :cstag =expand("")
map g :cs find g =expand("")
map  :cs find 0 =expand("")
map  :cs find f =expand("")
                set csverb
endif
从帮助上看到的,自己稍微改了一点。
4.cscope是什么? †
cscope 是一个 C 语言的浏览工具,通过这个工具可以很方便地找到某个函数或变量的定义位置、被调用的位置等信息。目前支持 C 和 C++。cscope 自身带一个基于文本的用户界面,不过 gvim 提供了cscope接口,因此可以在 gvim 中调用 cscope,方便快捷地浏览源代码。↑
为什么要使用cscope? †
假设我们在读一份很大的项目的源代码。我们也许会需要进行如下操作。函数 foo() 调用了函数 bar(),想看看函数 bar() 的内容。
想知道 foo() 在什么地方被调用。
想知道一个结构类型的定义。
虽然在 Linux 下使用 grep 或者在 Windows 下使用文件查找功能也能找到想找的文件,但是效率太低了。有没有什么更为方便快捷的方法?这就需要用到cscope。gvim结合cscope,可以很方 便地完成以上的操作,只需简单地敲几下键盘即可跳转到想去的地方。↑
如何使用cscope? †

下载 †
如果你使用的是Linux,那么恭喜你,很可能操作系统已经为你提供了cscope工具。使用下面的命令确认它是否存在:cscope -V
如果cscope工具已经安装,上面的命令将显示cscope的版本号,类似于下面的结果:cscope: version 16.0a
但是如果提示错误说找不到cscope命令,说明cscope尚未安装。你可以到网上去寻找cscope的RPM包。另外,我们可以从cscope官方网 站上下载到 cscope 的最新源代码。在Linux下你可以编译该源代码生成cscope的可执行文件。如果你是Windows用户,就没有这么好的福气了,因为在 Windows下编译程序并不是很简单的事情。好在已经有人为我们编译好了Windows版,可以从这里下载到:
http://iamphet.nm.ru/cscope/
。↑
安装 †
安装很简单,只要将cscope的可执行文件放到PATH环境变量包含的目录中即可。推荐Windows用户将上面下载到的 cscope.exe 与 gvim 放在同一个目录下,如 C:/Program Files/Vim/gvim64 下,然后单击开始菜单选择运行,输入 cmd,启动命令行提示符程序,执行cscope -V
如果能看到cscope的版本好则说明安装成功。另外,为了方便地使用cscope,我们还需要下载cscope的键盘映射设置,这样就可以在gvim中简单地通过快捷键来使用 cscope,而不必敲复杂的命令了。键盘映射可以从这里下载:
http://cscope.sourceforge.net/cscope_maps.vim
将下载到的 cscope_maps.vim 放在gvim的插件目录里,如 C:/Program Files/Vim/vimfiles/plugin 中。Linux用户可以放在 $HOME/.vim/plugin 中。↑
建立符号数据库 †
我们假设我们要阅读的代码放在 D:/src/myproject 下。然后打开命令行,进入源代码所在的目录,为 cscope 建立搜索文件列表。在命令行中执行以下命令:dir /s /b *.c *.h  > cscope.files
如果你的源代码是C++,则可以将 cpp 等扩展名也加入到上面的命令中。dir /s /b *.c *.h *cpp *.hpp  > cscope.files
如果是Linux用户,则可以使用 find 命令实现同样的功能:find $(pwd) -name "*.[ch]"
然后执行以下命令:cscope -b
执行结束后你可以在当前目录下发现 cscope.out 文件,这就是 cscope 建立的符号数据库。上面这个命令中,-b参数使得cscope不启动自带的用户界面,而仅仅建立符号数据库。↑
浏览源代码 †
使用 gvim 打开你的源代码目录中任意一个C程序文件。然后在gvim中执行如下命令::cscope add D:/src/myproject/cscope.out
由于在 gvim 中可以使用命令缩写,因此上面的命令可以写成::cs a D:/src/myproject/cscope.out
这样就打开了刚刚建立的符号数据库。通过下面的命令可以检查数据库连接的存在。:cscope show
该命令可以缩写为:cs s
现在将光标移动到源代码中的某个函数名上,依次按下一下组合键:s
稍等片刻之后你会在屏幕下放看到如下的字样*1:Cscope tag: display
   #   line  filename / context / line
   1    342  D:/src/myproject/src/global.h
             void display(void );
   2    616  D:/src/myproject/src/command.c
             display();
   3    138  D:/src/myproject/src/display.c
             display(void )
   4    385  D:/src/myproject/src/main.c
             display();
   5    652  D:/src/myproject/src/main.c
             display();
   6    663  D:/src/myproject/src/main.c
             display();
Enter nr or choice ( to abort):
这里显示出的就是整个工程中使用到了 display 这个标识符的位置。此时输入 4,回车,即可跳转到 main.c 的 385 行调用 display() 函数的地方进行浏览。浏览结束后按 或者 可以回到跳转前的位置。然后将光标移动到源代码某个函数名上,迅速地依次安下面的组合键:s
其中 按 Ctrl-2 即可输入。同样,屏幕上出现了一排结果,选择之后你会发现,跳转到的文件将在水平方向的新窗口中打开。然后将光标移动到源代码某个函数名上,迅速地依次安下面的组合键:s
选择之后你会发现,跳转到的文件将在垂直方向的新窗口中打开。以上我们简单介绍了cscope的使用方法,其中我们只用到了一个 s 命令,即跟在 和 后面的 s 键。同样,我们可以使用以下的功能键实现不同的跳转功能。c: 查找该函数被调用的位置
d: 查找该函数调用了哪些函数
e: 查找指定的正规表达式
f: 查找指定的文件
g: 查找指定标识符的定义位置
i: 查找该文件在哪些地方被包含
s: 查找指定标识符的使用位置
t: 查找指定的文本字符串

命令行使用说明 †
除了上述通过快捷键映射的方式使用cscope之外,也可以直接在gvim命令行中使用cscope。这样就可以随意定义查找字符串,而不必局限于源代码中已有的标识符。命令格式如下::cscope find  
该命令可以缩写为:cs f  
一个比较实用的技巧是使用cscope打开文件。使用以下命令即可直接打开名为display.c的文件,而不必先切换到display.c所在的目录。:cs f f display.c
cscope也支持正规表达式。如果记不清某个函数的名称,可以用下面的方式来找到该函数的定义位置。:cs f g .*SetConfiguration.*

版权 †
Cscope虽然不是GPL版权,但是Cscope是开放源码的自由软件,使用Cscope无须支付任何费用。↑
参考 †
Cscope官方主页,
http://cscope.sourceforge.net/

The Vim/Cscope tutorial,
http://cscope.sourceforge.net/cscope_vim_tutorial.html

Cscope on Win32,
http://iamphet.nm.ru/cscope/

Vim中关于 cscope 的帮助,使用 :help cscope 命令查看

阅读更多
个人分类: 嵌入式开发相关
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭