Linux内核源码阅读系列(0)-代码阅读工具

欲善其事比先利其器。Linux内核代码非常庞大,阅读这么多的源代码只能是以点带面,如果没有ctags或者cscope这样的代码阅读索引工具的帮助,没有vi或者emacs这些编辑器支持的话,短时间内快速阅读几乎是“mission impossible”。Windows平台上可以使用SourceInsight,这是一款商业软件,功能也是相当强大的。除此以外,使用SciEdit或者notepadd++等等支持源码索引的编辑器配合Win32版本的ctags也能够做到事半功倍。我的工作主要集中在Linux平台上,所以,先为自己准备一下源码阅读的环境吧。

ctags(exuberant-ctags)最初是针对c语言的索引设计的,现在已经发展成为一个强大的代码索引工具,除了c语言意外还支持c++,java,python等多达33中语言。只有能够正确配置,这个工具的效率是很好的。因为Linux内核代码主要使用c语言(还有部分汇编代码和c++代码),所以,即便采用最原始的ctags也能对Linux内核代码正确索引。ctags的索引方法很简单,只要进入源代码顶层目录,然后执行下面的命令,搞定。

ctags -R

cscope在大型项目中的表现可能要优于ctags,所以,我打算在自己看代码的过程中使用cscope。cscope比ctags稍微复杂一点,但是仅仅也就是多了一个cscope.files指出的文件列表。当然,如果你需要索引整个Linux代码,也主需要在源代码顶层目录

cscope -Rb

就可以了。这里有一个完全教程——《在大型项目中使用Cscope(例子:Linux内核)》,是我昨晚披星戴月的翻译的,希望能给一起阅读源码的兄弟加把力气。

另外一个问题是,如何将这些索引工具跟vim或者emacs配合使用,我非常羡慕使用emacs的同学,特别是他们灵活的左手小指…….我只会用vim。在.vimrc文件中加入下面两行

"" for tags
map <C-F12> :!ctags -R .; find . -name "*.c" -o -name "*.cc" -o -name "*.hpp" -o -name "*.hh" -o -name "*.h" -o -name "*.cpp" -o -name "*.py" -o -name "*.pl" -o -name "*.pm" | cscope -Rb -i- <CR>
set tags=./tags,./TAGS,tags,TAGS,/usr/include/tags

注意,我这是囫囵吞枣的做一下tag,如果你是完美主义者,还是google一下互联网,精炼自己的tag命令。Linux源代码阅读系列post,算是上路了。

5 thoughts on “Linux内核源码阅读系列(0)-代码阅读工具

  1. 试一下global,很不错的。可以和vim,emacs配合使用,更可以自动生成页面和cgi脚本,通过浏览器像lxr那样使用。。。

    • Nod.这个我也试用了一下,但是ctags和cscope我都用熟了,就先将就一下,反正做索引的工作还是能完成的。

  2. 这方面我一直不满意,ctags对cpp源文件的支持似乎总是不尽如人意。尤其是有同名函数的时候就真是。。。而要找出一系统函数的调用关系时,cscope感觉也使不上劲,现在自己都是捋上袖子亲自上阵,grep来grep去,感觉还是比较麻烦。
    cscope看来还真得重新弄下。

  3. @Richard “尤其是有同名函数的时候就真是。。。”,深表同情先,这个原因是ctags在tag文件中使用正则表达式而不是直接跳转的行号导致的吧。看看SilentBob,http://silentbob.sourceforge.net/
    cscope对于调用关系也是没辙……看开商业软件SourceInsight还是有它强悍的地方。

发表评论