Chinaunix首页 | 论坛 | 博客
  • 博客访问: 267109
  • 博文数量: 107
  • 博客积分: 305
  • 博客等级: 二等列兵
  • 技术积分: 417
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-22 09:42
文章分类

全部博文(107)

文章存档

2014年(3)

2013年(41)

2012年(34)

2011年(28)

2008年(1)

分类: LINUX

2013-10-24 13:44:36

   Global源码标签工具支持C,C++,YACC,JAVA,PHP4,ASM。并且可以与shell,vi,emacs,浏览器,doxygen等等配合使用。也是款不错的工具。

以分析linux内核为例
1.准备
  1. $cd /usr/src/linux
  2. $gtags

gtags会分析当前目录以及所有子目录。之后会在当前目录生成数据库文件
  1. $ls G*
  2. GPATH GRTAGS GSYMS GTAGS

分别为:
GPATH 路径名称数据库;
GRTAGS 引用数据库;
GTAGS 定义数据库;
GSYMS 符号数据库,存放没有出现在GTAGS中的符号;

对于分析内核源码,这些数据库需要将近400M空间。

2.global命令使用方法
 直接查询函数:
  1. $global start_kernel
  2. arch/alpha/boot/bootp.c
  3. arch/alpha/boot/bootpz.c
  4. arch/alpha/boot/main.c
  5. init/main.c
 查询函数引用:-r
  1. $global -r start_kernel
  2. arch/blackfin/mach-bf548/head.S
  3. arch/frv/kernel/debug-stub.c
  4. arch/mn10300/kernel/gdb-stub.c
  5. ...
使用POSIX标准正则
  1. $global 'ah[46]_init'
  2. net/ipv4/ah4.c
  3. net/ipv6/ah6.c
显示函数详细信息 -x
  1. $global -x ah4_init
  2. ah4_init 321 net/ipv4/ah4.c static int __init ah4_init(void)
显示文件所在绝对路径 -a
  1. $global -a ah4_init
  2. /usr/src/linux-source-2.6.26/net/ipv4/ah4.c
查看'GTAGS'没有定义的符号 -s
  1.  global -xs X |more
  2. X                 161 arch/alpha/kernel/setup.c #define WEAK(X) \
  3. X                 39 arch/arm/common/dmabounce.c #define DO_STATS(X) do { X ; } while (0)
  4. X                 41 arch/arm/common/dmabounce.c #define DO_STATS(X) do { } while (0)
  5. ...
有点类似egrep命令 -g
  1. $global -xg 'Linus Torvalds' | more
  2. Linus%20Torvalds 8 arch/alpha/boot/bootp.c * based significantly on the arch/alpha/boot/main.c of Linus Torvalds
  3. Linus%20Torvalds 9 arch/alpha/boot/bootpz.c * based significantly on the arch/alpha/boot/main.c of Linus Torvalds
  4. Linus%20Torvalds 4 arch/alpha/boot/main.c * Copyright (C) 1994, 1995 Linus Torvalds
  5. ...
按文件名查找 -P
  1. $global -P 'head\.S$'
  2. arch/alpha/boot/head.S
  3. arch/alpha/kernel/head.S
  4. arch/arm/boot/compressed/head.S
  5. arch/arm/kernel/head.S
  6. ...
显示文件中对象 -f
  1. $global -f net/ipv4/af_inet.c
  2. DEFINE_SNMP_STAT 119 net/ipv4/af_inet.c DEFINE_SNMP_STAT(struct linux_mib, net_statistics) __read_mostly;
  3. inet_autobind 174 net/ipv4/af_inet.c static int inet_autobind(struct sock *sk)
  4. inet_listen 194 net/ipv4/af_inet.c int inet_listen(struct socket *sock, int backlog)
  5. ...
限制在当前目录查找 -l
  1. $cd net/ipv4/
  2. $global -l ah[46]_init
  3. ah4.c
3.其它用法例子
生成指定文件的源码标签数据库
  1. $ find . -type f -print >/tmp/list # make a file set
  2. $ vi /tmp/list                     # customize the file set
  3. $ gtags -f /tmp/list
给只读文件夹生成源码标签数据库,例如cdrom上的源码,数据库文件不能放在当前目录下,这种情况可以使用GTAGSROOT环境变量
  1. $ mkdir /var/dbpath
  2. $ cd /cdrom/src          # the root of source tree
  3. $ gtags /var/dbpath      # make tag files in /var/dbpath
  4. $ export GTAGSROOT=`pwd`
  5. $ export GTAGSDBPATH=/var/dbpath
  6. $ global func
设置多个搜寻目录
  1. $ pwd
  2. /develop/src/mh # this is a source project
  3. $ gtags
  4. $ ls G*TAGS
  5. GRTAGS GTAGS
  6. $ global mhl
  7. uip/mhlsbr.c # mhl() is found
  8. $ global strlen # strlen() is not found
  9. $ (cd /usr/src/lib; gtags) # library source
  10. $ (cd /usr/src/sys; gtags) # kernel source
  11. $ export GTAGSLIBPATH=/usr/src/lib:/usr/src/sys
  12. $ global strlen
  13. ../../../usr/src/lib/libc/string/strlen.c # found in library
  14. $ global access
  15. ../../../usr/src/sys/kern/vfs_syscalls.c # found in kernel
查询某个对象全名称 -c
  1. $global -c start_k
  2. start_kcs_transaction
  3. start_kernel
  4. start_kernel_proc
  5. start_kernel_thread
4.与应用程序配合使用
a.生成浏览器格式
生成浏览器格式需要很多磁盘空间,以390M内核为例,需要4-6G的空闲空间-_-!
  1. $gtags
  2. $htags
完成后在当前目录下多个HTML目录。htags有很多选项,如果不熟悉的话,建议使用--suggest选项

b.VIM
使用vim的话,先用gtags生成数据库,然后安装插件
  1. $mkdir ~/.vim
  2. $mkdir ~/.vim/plugin
  3. $cp /usr/share/doc/global/examples/gtags.vim.gz ~/.vim/plugin/
  4. $cd ~/.vim/plugin
  5. $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时直接定位到函数
  1. $vim '+Gtags start_kernel'

还有很多功能没细看,以后慢慢补充

参考文章:

阅读(1671) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~