cscope使用

cscope使用
2006年07月07日 07:57 来源:ChinaUnix博客 作者:新华网 编辑:周荣茂

    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() 的内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值