C代码阅读工具(2)---ctags
上一周主要介绍了calltree工具,对于刚接触到源码,但不知从何下手时有一定的帮助,能帮助你对代码中的整体有一个了解。例如从main函数开始,能知道代码的大概分支,整个源码中比较重要的几个.c文件等。当对项目的整个源码有一个大概了解之后,我们需要对函数的实现细节进行分析,这样就需要对代码中部分函数体进行更细的阅读。下面我们再介绍Linux下两个源码阅读工具:
vim: Linux下编辑的工具,vim与emace被人称为程序员的倚天剑和屠龙刀,所以vim的相关网上比较多,并且大家也基本都比较清楚。
当我们单纯的使用vim进行.c文件编辑时,在一个函数中想查看该函数内部调用的一个函数实现体时,就会有些麻烦了。例如在main函数中调用了setup()函数,可是该函数并不与main函数同在一个文件中,那么使用vim寻找起来就显得相当的费劲了,下面我们介绍一个能够灵活定位函数、变量、类型、结构体的工具ctags。
ctags: 是一个用于生成tags文件的软件,
使用:首先进入你需要阅读的源码目录,然后使用ctags –r命令生成标签文件,-r选项与一般的shell命令一样表示递归操作,这样同时为当前目录下的子目录也生成了相应的标签文件。
每个目录下的tags文件主要包括下面这些列表:
用#define定义的宏
枚举型变量的值
函数的定义、原型和声明
名字空间(namespace)
类型定义(typedefs)
变量(包括定义和声明)
类(class)、结构(struct)、枚举类型(enum)和联合(union)
类、结构和联合中成员变量或函数
通过上面这个表可以看出,该中包含了很多calltree工具没有体现的内容。
举例:
timer
timer
上面两条表示timer变量在上面两处有定义,都是isc_timer_t * timer;形式定义的。
gslb_find gslb.c /^gslb_find(ns_client_t *client, isc_netaddr_t *addrp, dns_name_t *name,$/;"
gslb_find_acl gslb.c
上面两条表示gslb_find函数与gslb_find_acl函数在gslb.c文件中定义,函数的
下面主要讲一下怎么在vim中使用tags文件。
首先使用vim打开一个.c文件,然后就可以使用 :tag func命令定位到函数func处,使用tag命令时,也可以使用TAB键进行匹配查找以及向下切换。
:tag:例如首先vim 打开main.c文件,使用:tag gslb_find命令后,会直接定位到galb.c文件中gslb_find函数原型处。当有多处都符合时,例如:tag timer,那么显示多处匹配点提供选择。如下图:
# pri kind tag
1 F
struct:ns_client
isc_timer_t *
2 FS
struct:controlconnection
isc_timer_t *
Choice number (<Enter> cancels):
:tnext当我们根据上面的提示选择第一个后,那么光标会定位到include/named/client.h的isc_timer_t *
:tfirst 当有多个匹配时,用于定位到第一个匹配处;
:tlast
:tselect tagname 与tag tagname类似,显示所有的tagname,提供给用户选择。
CTRL + ] 和CTRL + t
在一般源码阅读过程中,最简单的方法是把光标移到变量名或函数名上,然后按下“Ctrl+]”,这样就能直接跳到这个变量或函数定义的源文件中, 并把光标定位到这一行。阅读完该函数后再用“Ctrl+t”可以退回原来的地方。即使用户使用了N次“Ctrl+]”查找了N个不同的tag,按N次“Ctrl+t”也能回到最初定位的光标点,它会按原路返回。
附:在linux下源码阅读工具还有Cscope、Global、LXR、KScope、sourcenav等等,这里就不一一介绍了,其它这些工具我接触较少,不过以后可以尝试这些工具与tags做一个比较。