Vim系列 - 使用 Cscope 阅读源码

Posted StarfxTalk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vim系列 - 使用 Cscope 阅读源码相关的知识,希望对你有一定的参考价值。


最近迷上了 nginx,逐渐接触到源码层面,于是有了阅读 Nginx 源码的需求,业界大名鼎鼎的 Source Insight 太贵,没办法,寻找简单的开源替代方案,于是就使用 Vim + Cscope 来搞了一下,使用下来的感受是搞定日常的读源码需求足够用。


Vim 对 Cscope 的依赖在大多数发行版的 Vim 中都是标配,所以只需要确保 Cscope 软件本身被安装就可以在 Vim 下正常使用。


为了让 Cscope “认识” 一个源码包,首先需要在源码包的根目录下使用

cscope -Rb

命令建立 Cscope 的数据文件 cscope.out,然后就可以在 Vim 里使用这个 cscope.out 文件来浏览这个源码包了。


cscope 最主要的命令有2条


:cs add <file-or-dir>


用来建立 Vim 和一个具体的 cscope.out 文件之间的联系,后续发出的所有查询都会在这个绑定的 cscope.out 文件里进行。


:cs find <query-type> <query-string>

:scs find <query-type> <query-string>


用来实施具体的查询。


:scs 和 :cs 命令的唯一区别是在打开一个新窗口展示搜索结果时,:scs 使用分割窗口的方法, 而不是完全覆盖旧窗口的方法。


<query-type> 一共有9种类型,翻译一下分别是:


0 or s:哪里使用了这个 symbol

1 or g:哪里定义了这个 symbol

2 or d:这个方法调用了哪些方法

3 or c:哪些方法调用了这个方法

4 or t:哪里出现了这个字符串

6 or e:哪里出现了这个正则匹配(格式同 egrep)

7 or f:(还没搞明白行为,以后再说)

8 or i:哪里 include 了这个文件

9 or a:哪里为这个 symbol 赋了值


下面说几个场景:


  1. 当看到 ngx_http_header_t 这个结构体时,想知道结构体的具体信息,可以使用
    :cs find g ngx_http_header_t
    查看。当然也可以使用
    :cs find s ngx_http_header_t
    来查看还有哪里使用到了这个结构体。

  2. 当看到 ngx_http_init_phases 这个方法申明时,想查看方法的具体信息,可以使用
    :cs find d ngx_http_init_phases
    查看(搜索结构中任选一个)。当然也可以使用
    :cs find c ngx_http_init_phases
    来查看都有哪些地方调用了这个方法。

  3. 当想查看 HTTP 头部 X-Real-IP 的处理细节时,可以使用
    :cs find t X-Real-IP
    来查看。

  4. 当看到 ngx_http.h 时候,想查看都有哪些文件 include 了这个文件,可以使用
    :cs find i ngx_http.h
    来查看。

  5. 当想查找变量 ngx_test_config 在哪些地方被赋值时,可以使用
    :cs find a ngx_test_config
    来查看。


下面逐个演示。



happy hacking.

以上是关于Vim系列 - 使用 Cscope 阅读源码的主要内容,如果未能解决你的问题,请参考以下文章

linux内核源码级调试

linux——cscope

ubuntu下linux内核源码阅读工具和调试方法总结

ctags+cscope替换sourceinsight

cscope usage

cscope使用记录