因为长期受 Windows 下 source insight 查看内核源码的困扰(Windows下文件大小写问题、无法完全 synchronize symbol、以及全局查询较慢),因此另寻出处,找到本文的解决方案。本文的 OS 环境为 SLES15。
一、安装&环境准备
安装 vim(通过 vim 查看代码文件)
-
Bash 代码
1 | zypper in vim |
安装 ctags(ctags 生成代码文件中各种数据类型的索引文件,每个标识符的定义、所在文件中的行位置、所在文件的路径等信息称为 tag)
下载地址:http://ctags.sourceforge.net/,本文档下载最新版本:ctags-5.8.tar.gz
-
Bash 代码
1 | tar -zxvf ctags-5.8. tar .gz |
2 | cd ctags-5.8/ |
3 | ./configure |
4 | make |
5 | ./mkinstalldirs |
6 | make install |
7 | 检查是否安装成功: |
8 | whereis ctags |
安装 Taglist(Taglist 需要 ctags 的支持,该安装包可以实现查看 symbol 列表的功能)
下载地址:https://sourceforge.net/projects/vim-taglist/files/vim-taglist/,本文档下载最新版本:taglist_46.zip
-
Bash 代码
1 | cd ~ |
2 | mkdir .vim |
3 | unzip taglist_46.zip -d ~/.vim |
4 | ls ~/.vim |
配置帮助文件到vim
-
Bash 代码
1 | vim |
2 | :helptags ~/.vim/doc |
将 Taglist 与 ctags 关联,以及Taglist相关配置
-
Bash 代码
1 | vi ~/.vim/plugin/taglist.vim |
在 "if !exists('loaded_taglist')" 之上添加如下内容:
-
Bash 代码
1 | "默认显示行号 |
2 | set nu |
3 | "将 Taglist 与 ctags 关联 |
4 | let Tlist_Ctags_Cmd= "/usr/local/bin/ctags" |
然后在文件末尾添加如下配置:
-
Bash 代码
1 | "语法高亮 |
2 | syntax on |
3 |
4 | "设置taglist宽度(默认30),可以根据自己的环境进行设置 |
5 | let Tlist_WinWidth=50 |
6 |
7 | "tagList窗口是最后一个窗口,则退出Vim |
8 | let Tlist_Exit_OnlyWindow=1 |
安装 cscope(可以认为该工具为 ctags 的加强版,具有强大的查询 symbol 功能)
下载:https://software.opensuse.org/package/cscope,本文档下载版本为:cscope-15.8b-2.8.x86_64.rpm
也可以去官网下载:https://sourceforge.net/projects/cscope/files/
-
Bash 代码
1 | rpm -ivh cscope-15.8b-2.8.x86_64.rpm |
二、进入源码目录,构建索引
构建 ctags 索引
-
Bash 代码
1 | cd 源码目录 |
2 | ctags -R |
此时源码目录下生成如下文件:
构建 cscope 索引
-
Bash 代码
1 | cd 源码目录 |
2 | cscope -Rbq |
此时源码目录生成如下文件:
.out 是最基本的符号索引,后两个文件是 -q 参数生成的,可一加快 cscope 的索引速度
cscope 命令参数含义如下:
-
Bash 代码
1 | -R: 在生成索引文件时,搜索子目录树中的代码 |
2 | -b: 只生成索引文件,不进入cscope的界面 |
3 | -k: 在生成索引文件时,不搜索/usr/include目录 |
4 | -q: 生成cscope. in .out和cscope.po.out文件,加快cscope的索引速度 |
5 | -i: 如果保存文件列表的文件名不是cscope.files时,需要加此选项告诉cscope到哪儿去找源文件列表。可以使用 "-" ,表示由标准输入获得文件列表。 |
6 | -I dir : 在-I选项指出的目录中查找头文件 |
7 | -u: 扫描所有文件,重新生成交叉索引文件 |
8 | -C: 在搜索时忽略大小写 |
9 | -P path: 在以相对路径表示的文件前加上的path,这样,你不用切换到你数据库文件所在的目录也可以使用它了 |
三、实操
进入源码目录,vim 某个文件
-
Bash 代码
1 | vim drivers/usb/host/xhci-ring.c |
此时默认就能够使用 ctags 的功能,常见用法的快捷键如下(:help tags【打开 ctags 命令介绍】):
Ctrl + ]【跳到光标所在 symbol 的定义处】
Ctrl + t【返回到上一次光标停留处】
:ta le64_to_cpu【跳到 le64_to_cpu 定义处】
:ts le64_to_cpu
g + ctrl + ]【列出光标所在 symbol 的所有定义】
:tn【跳到在上一步列出 symbol 中 的下一个】
:tp【跳到在上一步列出 symbol 中 的上一个】
:tj le64_to_cpu【如果只有一个定义直接跳入,如果有多个让用户选择】
如果有需要可以打开 Taglist 显示当前文件的所有 symbol
-
Bash 代码
1 | :Tlist |
用法:
Ctrl + w + w:在两个窗口之间切换
左边窗口上下移动光标,回车,右边窗口会跳到光标所指 symbol
切换到左窗口,F1 显示帮助(标红的为常用功能):
<enter> : Jump to tag definition
o : Jump to tag definition in new window
p : Preview the tag definition
<space> : Display tag prototype
u : Update tag list
s : Select sort field
d : Remove file from taglist
x : Zoom-out/Zoom-in taglist window
+ : Open a fold
- : Close a fold
* : Open all folds
= : Close all folds
[[ : Move to the start of previous file
]] : Move to the start of next file
q : Close the taglist window
<F1> : Remove help text
命令行模式下添加 cscope 索引:
此时可以使用 cscope 相关命令了,cscope 相关命令如下:
a:找到符号的赋值
s: 查找C语言符号,即查找函数名、宏、枚举值等出现的地方
g: 查找函数、宏、枚举等定义的位置,类似ctags所提供的功能
d: 查找本函数调用的函数
c: 查找调用本函数的函数
t: 查找指定的字符串
e: 查找egrep模式,相当于egrep功能,但查找速度快多了
f: 查找并打开文件,类似vim的find功能
i: 查找包含本文件的文件
举例(查找哪些函数调用了指定函数):
-
Bash 代码
1 | :cs f c handle_cmd_completiont |