Global源码标签工具支持C,C++,YACC,JAVA,PHP4,ASM。并且可以与shell,vi,emacs,浏览器,doxygen等等配合使用。也是款不错的工具。
以分析linux内核为例
1.准备
- $cd /usr/src/linux
-
$gtags
gtags会分析当前目录以及所有子目录。之后会在当前目录生成数据库文件
- $ls G*
- GPATH GRTAGS GSYMS GTAGS
分别为:
GPATH 路径名称数据库;
GRTAGS 引用数据库;
GTAGS 定义数据库;
GSYMS 符号数据库,存放没有出现在GTAGS中的符号;
对于分析内核源码,这些数据库需要将近400M空间。
2.global命令使用方法
直接查询函数:
- $global start_kernel
-
arch/alpha/boot/bootp.c
-
arch/alpha/boot/bootpz.c
-
arch/alpha/boot/main.c
-
init/main.c
查询函数引用:-r
- $global -r start_kernel
-
arch/blackfin/mach-bf548/head.S
-
arch/frv/kernel/debug-stub.c
-
arch/mn10300/kernel/gdb-stub.c
- ...
使用POSIX标准正则
- $global 'ah[46]_init'
-
net/ipv4/ah4.c
-
net/ipv6/ah6.c
显示函数详细信息 -x
- $global -x ah4_init
-
ah4_init 321 net/ipv4/ah4.c static int __init ah4_init(void)
显示文件所在绝对路径 -a
- $global -a ah4_init
-
/usr/src/linux-source-2.6.26/net/ipv4/ah4.c
查看'GTAGS'没有定义的符号 -s
- global -xs X |more
- X 161 arch/alpha/kernel/setup.c #define WEAK(X) \
- X 39 arch/arm/common/dmabounce.c #define DO_STATS(X) do { X ; } while (0)
- X 41 arch/arm/common/dmabounce.c #define DO_STATS(X) do { } while (0)
- ...
有点类似egrep命令 -g
- $global -xg 'Linus Torvalds' | more
-
Linus%20Torvalds 8 arch/alpha/boot/bootp.c * based significantly on the arch/alpha/boot/main.c of Linus Torvalds
-
Linus%20Torvalds 9 arch/alpha/boot/bootpz.c * based significantly on the arch/alpha/boot/main.c of Linus Torvalds
-
Linus%20Torvalds 4 arch/alpha/boot/main.c * Copyright (C) 1994, 1995 Linus Torvalds
- ...
按文件名查找 -P
- $global -P 'head\.S$'
- arch/alpha/boot/head.S
- arch/alpha/kernel/head.S
- arch/arm/boot/compressed/head.S
- arch/arm/kernel/head.S
- ...
显示文件中对象 -f
- $global -f net/ipv4/af_inet.c
-
DEFINE_SNMP_STAT 119 net/ipv4/af_inet.c DEFINE_SNMP_STAT(struct linux_mib, net_statistics) __read_mostly;
-
inet_autobind 174 net/ipv4/af_inet.c static int inet_autobind(struct sock *sk)
-
inet_listen 194 net/ipv4/af_inet.c int inet_listen(struct socket *sock, int backlog)
- ...
限制在当前目录查找 -l
- $cd net/ipv4/
-
$global -l ah[46]_init
-
ah4.c
3.其它用法例子
生成指定文件的源码标签数据库
- $ find . -type f -print >/tmp/list # make a file set
-
$ vi /tmp/list # customize the file set
-
$ gtags -f /tmp/list
给只读文件夹生成源码标签数据库,例如cdrom上的源码,数据库文件不能放在当前目录下,这种情况可以使用GTAGSROOT环境变量
- $ mkdir /var/dbpath
-
$ cd /cdrom/src # the root of source tree
-
$ gtags /var/dbpath # make tag files in /var/dbpath
-
$ export GTAGSROOT=`pwd`
-
$ export GTAGSDBPATH=/var/dbpath
-
$ global func
设置多个搜寻目录
- $ pwd
-
/develop/src/mh # this is a source project
-
$ gtags
-
$ ls G*TAGS
-
GRTAGS GTAGS
-
$ global mhl
-
uip/mhlsbr.c # mhl() is found
-
$ global strlen # strlen() is not found
-
$ (cd /usr/src/lib; gtags) # library source
-
$ (cd /usr/src/sys; gtags) # kernel source
-
$ export GTAGSLIBPATH=/usr/src/lib:/usr/src/sys
-
$ global strlen
-
../../../usr/src/lib/libc/string/strlen.c # found in library
-
$ global access
-
../../../usr/src/sys/kern/vfs_syscalls.c # found in kernel
查询某个对象全名称 -c
- $global -c start_k
-
start_kcs_transaction
-
start_kernel
-
start_kernel_proc
-
start_kernel_thread
4.与应用程序配合使用
a.生成浏览器格式
生成浏览器格式需要很多磁盘空间,以390M内核为例,需要4-6G的空闲空间-_-!
完成后在当前目录下多个HTML目录。htags有很多选项,如果不熟悉的话,建议使用--suggest选项
b.VIM
使用vim的话,先用gtags生成数据库,然后安装插件
- $mkdir ~/.vim
-
$mkdir ~/.vim/plugin
-
$cp /usr/share/doc/global/examples/gtags.vim.gz ~/.vim/plugin/
- $cd ~/.vim/plugin
- $gzip -d gtags.vim.gz
vim+gtags简单用法:
:Gtags start_kernel //打开函数浏览
[Quickfix List]操作
:cn //切换下一个文件
:cp //切换前一个文件
:ccN //N为数字,切换到指定序号文件
:cl //查看整个列表
:h quickfix //list帮助
其他命令与global类似-r,-s,-f,-g 等等
tab键可以自动补全函数
打开vim时直接定位到函数
- $vim '+Gtags start_kernel'
还有很多功能没细看,以后慢慢补充
参考文章:
阅读(10334) | 评论(0) | 转发(3) |