Linux中国 Linux中国门户站!
设为主页 设为主页
收藏本站 收藏本站
 
当前位置 :首页 ->Linux技术 ->系统管理 ->正文

如何阅读源代码--工具篇

来源:Linux-cn.com 作者:Webmaster 时间:2007-05-05 点击: [收藏] [投稿]

  在上一篇文章(<<如何阅读源代码>>(http://www.linuxaid.com.cn/developer/showdev.jsp?i=469))中, 我讲述了一些如何阅读GNU,Open Source源代码的原则,经验和技巧。上次曾经提到,有一些工具能够帮助我们更加快速,准确,有效的阅读源代码,掌握其结构。在这一篇文章中我将具体介绍几个工具,帮助我们阅读,分析源代码。

  首先要介绍的工具叫做ctags. 这个工具在Unix下是一个常用的分析静态程序的工具,相信大家都用过。如果你对这个工具不熟悉,也不要紧。相信很多人都用过Windows系统下的开发工具,很多图形化界面的开发工具,诸如Visual C++, C++ Builder的IDE开发环境都提供了一种功能,就是在编辑器中可以准确的定位一个函数或者一个类的申明,或者实现,或者列出所有的在程序中调用该函数的地方。这种功能给程序员和阅读程序的人提供了很大的方便,不用在庞大的程序文本中到处搜寻一个字符串,只要轻轻的点一下鼠标就能准确的找到要找的东西。其实,Unix/Linux也有这样的工具,而且,继承了Unix程序小巧,精炼,功能强大,容易配合其它程序使用的特点,比Visual C++, C++ Builder的IDE环境更加方便实用,而且,还没有它们那么庞大。ctags结合vi,就是这么一个工具。

  先来看看在Unix下,ctags的功能。我用的是HP UX。有这么一个小程序,是用来解释ctags的用法的。


$cat test.c
int i;
main()
{
        f();
        g();
        f();
}
f()
{
        i = h();
}
用命令产生一个tags文件。
$ctags test.c
缺省情况下,ctags生成的文件叫做tags. 来看一看它的内容。
$cat tags
Mtest test.c /^main()$/
f test.c /^f()$/

  这个文件有三栏:

1、tag的名称,可以在稍后通过引用它来定位光标。 2、文件的名称。这个文件是tag所在的文件的名称。 3、搜索的方法。在我的系统上,ctags是用正则表达式的方式来搜索定位的。

  如何使用这个tags文件呢?

  我们以vi为例子来展示它的功能。vi是一个强大的文本编辑器,它的简洁的操作和强大的功能使它成为了Unix平台上的最流行的编辑器之一。ctags支持vi的功能。使用方法很简单。如果我们要定位main()函数,只要$vi -t Mtest

  vi自动的打开了test.c文件,然后把光标定位到main()函数的开头处。在vi中,如果要使用其它的tag来定位别的函数,也只要使用:ta tag命令就可以了。比如在本例中,我们要定位f函数。那么,只要用 :ta f 光标就自动定位到f()函数的入口处。很简单吧?

  在Linux下,也可以找到ctags. 一般的Linux发行版都包括了这个工具。如果你的系统上没有ctags, 也可以到http://ctags.sourceforge.net/下载它。它的作者是Darren Hiebert , , 主页地址是http://darren.hiebert.com/

  Linux下的ctags比Unix下的ctags功能更加强大,而且更加可以定制。Unix下的ctags(我的系统上是这样)只支持三种语言:C, Pascal, Fortran, 而Linux下的ctags支持的语言有:Assembler, AWK, BETA, Bourne shell, C/C++, COBOL, Eiffel, Fortran, Java, Lisp, Perl, Python, Scheme, Tcl. 而且Linux下的ctags支持的编辑器也很多,有:vi 和它的派生Vim, Vile, Lemmy, CRiSP, emacs, FTE (Folding Text Editor), NEdit (Nirvana Edit), TSE (The SemWare Editor), X2, Zeus.

  好,现在就让我们来看一看ctags的强大功能以及它在阅读源代码的时候的用处吧。我将仍然以webalizer为例子,因为这个程序是在上一篇文章<<如何阅读源代码>>中使用过的,为了一贯性,也为了读者能够通过本文的阅读从而更加的了解这个程序和学到更多的经验技巧。考虑一下,当我们拿到一个C程序,我们如何能够快速的掌握它的结构呢?C程序是由一系列的函数,变量,宏,预编译指令组成的。而我们最为关心的是函数,和全局变量。那好,用ctags可以很方便的得到我们感兴趣的东西。

  以webalizer的主程序webalizer.c为例子,我们可以用:


[webalizer-2.01-09]$ ctags -x --c-types=f webalizer.c

  得到的结果如下


clear_month function 1614 webalizer.c void clear_month()
ctry_idx function 1738 webalizer.c u_long ctry_idx(char *str)
cur_time function 1695 webalizer.c char *cur_time()
from_hex function 1751 webalizer.c char from_hex(char c) 
/* convert hex to dec */
get_config function 1358 webalizer.c void get_config(char *fname)
get_domain function 1852 webalizer.c char *get_domain(char *str)
init_counters function 1627 webalizer.c void init_counters()
ispage function 1714 webalizer.c int ispage(char *str)
isurlchar function 1728 webalizer.c int isurlchar(char ch)
jdate function 1919 webalizer.c u_long jdate( int day, int month, int year )
main              
function 231 webalizer.c int main(int argc, char *argv[])
our_gzgets function 1873 webalizer.c 
char *our_gzgets(gzFile fp, char *buf, int size)
print_opts function 1657 webalizer.c void print_opts(char *pname)
print_version function 1670 webalizer.c void print_version()
save_opt function 1600 webalizer.c static char *save_opt(char *str)
srch_string function 1794 webalizer.c void srch_string(char *ptr)
unescape function 1763 webalizer.c char *unescape(char *str)

  在输出中可以看到所有的在webalizer.c中的函数,出现的行号,和它们的申明。方便吧?(当然,仅仅这样是不能读通源代码的,还是需要上一篇文章中的原则和技巧才能实际的读懂源代码。这个只是一个辅助工具,能够让我们更加方便快速准确而已)。要看函数的原型也很简单:

 如果您对本文有任何疑问或者建议,请到讨论区发表您的意见: >> 论坛入口 <<



上一篇:Linux C编程---进程   下一篇:LInux 应用程序如何处理当前运行环境的环境变量

文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论
更多相关文章
Power by linux-cn.com 粤ICP备05006655号