2008年11月15日 星期六 15:05
最近有好几个人问我使用什么阅读源代码,网上查了一下,关于Vim+Ctags+Cscope阅读源码的资料很多,但有些讲得太简略,于是自己整理了一下。 欢迎任何改进反馈 ;) ------------------- 使用Vim+Ctags+Cscope阅读源代码 --孔建军(Kongove.CN) 2008.11.15 代码阅读工具简介 对于学习Linux内核的人来说,源代码的阅读尤为重要。因为所有设计思想、内部机制都是 以代码的形式实现,所有的资料也都是为了更好的诠释代码。那么一个好的阅读工具,能 够提高阅读的效率和效果。常见的代码阅读工具有,Source Navigator、Source Insight 、lxr、Cscope等。 • "Source Navigator"是红帽子公司的,以GNU GPL发布,可从官方网站[1]下载使用。 • "Source Insight"目前只有Windows平台的,官方网站[2]。需要注册才能使用,或者 从网上下载注册机生成注册码。在Linux下通过wine模拟虽然可以方便使用,但它毕竟 是Windows平台的东西,并不能很自由的使用。 • lxr(linux cross reference)[3]为程序源代码建立索引数据库,利用perl脚本CGI动态 生成包含源码的web页面,你可以用任何一种浏览器查阅。缺点是需要服务器支持,还 有速度。 • "Cscope"[4]为终端下的代码阅读工具,资源消耗少,对那些忠于命令行的行操作的人 ,使用起来更加方便、灵活。这也是这篇文章推荐使用的一个重要原因。也有人把 Cscope和Emasc绑定阅读源码。当然工具的选取,也取决于个人习惯。 Vim+Ctags+Cscope cscope的工作需要vim、ctags的配合,它们都是基于命令行的。在Ubuntu下,用户只需执 行“sudo apt-get install cscope cscope-indexer ctags vim-full”即可完成软件安装。 下面只是给出了三种工具的常用方法,更多功能可查看man手册,或者官方文档。 Vim vim被看作是专门为程序员打造的文本编辑器,其丰富的编辑命令都是常用的简单字符,用 户很容易上手。vim可对180多种语言的语法高亮,对C语言自动缩进,真则表达式字符匹配 查找,功能强大,并支持多个操作系统平台。关于vim的使用,这里不做讲解。vim中文文 档[5]。 在Ubuntu下默认安装的vim,没有语法加亮功能。所以需要安装vim-full,并在vim 配置 文件 ~/.vimrc中添加一行 "syntax on" 这样在vim中打开的源码就有了语法高亮显示。 vim自带了很多颜色主题,可以直接选取下面一行添加到vim配置文件当中,重新打开vim即 可生效。 colorscheme elflord "我使用这个 colorscheme darkblue colorscheme evening colorscheme murphy colorscheme torte colorscheme desert Ctags 在源代码根目录下执行 ctags -r 命令用来为程序源代码生成标签文件,其-r选项表示递 归操作,同时为子目录也生成标签文件。vim利用生成的标签文件,可以进行相应检索、并 在不同的文件C语言元素之间来回切换。 在vim中ctags的简单使用 1) 跳转到指定的函数进入vim后,用 “:tag func_name“ 跳到函数func_name处。使用tag 命令时,可以使用TAB键进行匹配查找,继续按TAB键向下切换。 某个函数有多个定义时 :tag 跳到第一个定义处,优先跳转到当前文件 :tnext 跳到第一个 :tfirst 跳到前count个 :[count]tprevious 跳到后count个 :[count]tnext 跳到最后一个 :tlast 你也可以在所有tagname中选择: :tselect tagname 如果想跳到包含block的标识符:“tag /block” 然后用TAB键来选择。这里'/'就是告诉vim 'block'是一个语句块标签。 2)用“CTRL + ]“快捷键,跳转到光标所在函数标识符的定义处。 3)使用“CTRL + T”退回上层。如果想在以write_开头的标识符中选择一下, :tselect /^ write_ 这里,'^'表示开头,同理,'$'表示末尾。多个同名的标识符 Cscope 运行cscope命令,出现两个面板,上方是一个查找结果的显示面板,下方是一个查找条件 指定面板。使用TAB键在两个面板间切换,也可使用上下左右方向件和翻页键在同一面板内 贴换位置。选中显示面板的某个项,回车即可进入该文件,这是调用vim打开文件,这时就 可以结合ctags使用了。当然也可以直接使用vim打开文件,结合ctags阅读源码。 使用前,必须现使用“cscope-indexer -r”命令递归生成索引信息文件。特殊情况下,还需 要用户使用find命令,主动生成索引信息文件,并指定给cscope工具。 cscope提供了如下 九种查询方式: Find this C symbol: #查找指定的C符号 Find this global definition: #查找指定的全局定义 Find functions called by this function: #查找指定函数调用的函数 Find functions calling this function: #查找调用指定函数的函数 Find this text string: #查找字符串 Change this text string: #修改指定字符串 Find this egrep pattern: #查找匹配字符 Find this file: #查找指定文件 Find files #including this file: #指定引用头文件进行查找 在对应某一项中输入查找条件,回车即可进行查询,并将结果显示在显示面板。 应用实例 下面以使用cscope阅读内核源代码为例: $ wget http://kernel.org/pub/linux/kernel/v2.6/linux-2.6.27.6.tar.bz2 #从Linux内核官网下载内核源代码 $ tar xvfj linux-2.6.27.6.tar.bz2 #解压文件 $ cd linux-2.6.27.6 #进入源代码根目录 $ ctags -r #递归生成标签文件 $ cscope-indexer -r #递归生成索引信息文件 $ cscope #使用cscope阅读源码 标签文件、索引信息文件只需要第一次或者代码发生变动时生成,以后使用直接运行 cscope即可。 [1] http://sourcenav.sourceforge.net/ [2] http://www.sourceinsight.com/ [3] http://lxr.linux.no/ [4] http://cscope.sourceforge.net/ [5] http://vcd.gro.clinux.org/ -- Jianjun Kong @_@ Happy Hacking Homepage: http://kongove.cn/ Gtalk: kongjianjun在gmail.com
2008年11月15日 星期六 15:09
2008/11/15 Jianjun Kong <kongjianjun在gmail.com>: > > 最近有好几个人问我使用什么阅读源代码,网上查了一下,关于Vim+Ctags+Cscope阅读源码的资料很多,但有些讲得太简略,于是自己整理了一下。 > 欢迎任何改进反馈 ;) > ------------------- > > 使用Vim+Ctags+Cscope阅读源代码 > > --孔建军(Kongove.CN) > 2008.11.15 > > 代码阅读工具简介 > > 对于学习Linux内核的人来说,源代码的阅读尤为重要。因为所有设计思想、内部机制都是 > 以代码的形式实现,所有的资料也都是为了更好的诠释代码。那么一个好的阅读工具,能 > 够提高阅读的效率和效果。常见的代码阅读工具有,Source Navigator、Source Insight > 、lxr、Cscope等。 > > • "Source Navigator"是红帽子公司的,以GNU GPL发布,可从官方网站[1]下载使用。 > • "Source Insight"目前只有Windows平台的,官方网站[2]。需要注册才能使用,或者 > 从网上下载注册机生成注册码。在Linux下通过wine模拟虽然可以方便使用,但它毕竟 > 是Windows平台的东西,并不能很自由的使用。 > • lxr(linux cross reference)[3]为程序源代码建立索引数据库,利用perl脚本CGI动态 > 生成包含源码的web页面,你可以用任何一种浏览器查阅。缺点是需要服务器支持,还 > 有速度。 > • "Cscope"[4]为终端下的代码阅读工具,资源消耗少,对那些忠于命令行的行操作的人 > ,使用起来更加方便、灵活。这也是这篇文章推荐使用的一个重要原因。也有人把 > Cscope和Emasc绑定阅读源码。当然工具的选取,也取决于个人习惯。 > > Vim+Ctags+Cscope > > cscope的工作需要vim、ctags的配合,它们都是基于命令行的。在Ubuntu下,用户只需执 > 行"sudo apt-get install cscope cscope-indexer ctags vim-full"即可完成软件安装。 > 下面只是给出了三种工具的常用方法,更多功能可查看man手册,或者官方文档。 > > Vim > > vim被看作是专门为程序员打造的文本编辑器,其丰富的编辑命令都是常用的简单字符,用 > 户很容易上手。vim可对180多种语言的语法高亮,对C语言自动缩进,真则表达式字符匹配 > 查找,功能强大,并支持多个操作系统平台。关于vim的使用,这里不做讲解。vim中文文 > 档[5]。 > 在Ubuntu下默认安装的vim,没有语法加亮功能。所以需要安装vim-full,并在vim 配置 > 文件 ~/.vimrc中添加一行 "syntax on" 这样在vim中打开的源码就有了语法高亮显示。 > vim自带了很多颜色主题,可以直接选取下面一行添加到vim配置文件当中,重新打开vim即 > 可生效。 > > colorscheme elflord "我使用这个 > colorscheme darkblue > colorscheme evening > colorscheme murphy > colorscheme torte > colorscheme desert > > Ctags > > 在源代码根目录下执行 ctags -r 命令用来为程序源代码生成标签文件,其-r选项表示递 > 归操作,同时为子目录也生成标签文件。vim利用生成的标签文件,可以进行相应检索、并 > 在不同的文件C语言元素之间来回切换。 > > 在vim中ctags的简单使用 > 1) 跳转到指定的函数进入vim后,用 ":tag func_name" 跳到函数func_name处。使用tag > 命令时,可以使用TAB键进行匹配查找,继续按TAB键向下切换。 > 某个函数有多个定义时 > > :tag > 跳到第一个定义处,优先跳转到当前文件 > :tnext > 跳到第一个 > :tfirst > 跳到前count个 > :[count]tprevious > 跳到后count个 > :[count]tnext > 跳到最后一个 > :tlast > 你也可以在所有tagname中选择: > :tselect tagname > > 如果想跳到包含block的标识符:"tag /block" 然后用TAB键来选择。这里'/'就是告诉vim > 'block'是一个语句块标签。 > 2)用"CTRL + ]"快捷键,跳转到光标所在函数标识符的定义处。 > 3)使用"CTRL + T"退回上层。如果想在以write_开头的标识符中选择一下, :tselect /^ > write_ 这里,'^'表示开头,同理,'$'表示末尾。多个同名的标识符 > > Cscope > > 运行cscope命令,出现两个面板,上方是一个查找结果的显示面板,下方是一个查找条件 > 指定面板。使用TAB键在两个面板间切换,也可使用上下左右方向件和翻页键在同一面板内 > 贴换位置。选中显示面板的某个项,回车即可进入该文件,这是调用vim打开文件,这时就 > 可以结合ctags使用了。当然也可以直接使用vim打开文件,结合ctags阅读源码。 > 使用前,必须现使用"cscope-indexer -r"命令递归生成索引信息文件。特殊情况下,还需 > 要用户使用find命令,主动生成索引信息文件,并指定给cscope工具。 cscope提供了如下 > 九种查询方式: > > Find this C symbol: > #查找指定的C符号 > Find this global definition: > #查找指定的全局定义 > Find functions called by this function: > #查找指定函数调用的函数 > Find functions calling this function: > #查找调用指定函数的函数 > Find this text string: > #查找字符串 > Change this text string: > #修改指定字符串 > Find this egrep pattern: > #查找匹配字符 > Find this file: > #查找指定文件 > Find files #including this file: > #指定引用头文件进行查找 > > 在对应某一项中输入查找条件,回车即可进行查询,并将结果显示在显示面板。 > > 应用实例 > > 下面以使用cscope阅读内核源代码为例: > > $ wget http://kernel.org/pub/linux/kernel/v2.6/linux-2.6.27.6.tar.bz2 > #从Linux内核官网下载内核源代码 > $ tar xvfj linux-2.6.27.6.tar.bz2 > #解压文件 > $ cd linux-2.6.27.6 > #进入源代码根目录 > $ ctags -r ctags -R > #递归生成标签文件 > $ cscope-indexer -r > #递归生成索引信息文件 > $ cscope > #使用cscope阅读源码 > > 标签文件、索引信息文件只需要第一次或者代码发生变动时生成,以后使用直接运行 > cscope即可。 > > > > [1] http://sourcenav.sourceforge.net/ > [2] http://www.sourceinsight.com/ > [3] http://lxr.linux.no/ > [4] http://cscope.sourceforge.net/ > [5] http://vcd.gro.clinux.org/ > > -- > Jianjun Kong @_@ Happy Hacking > Homepage: http://kongove.cn/ > Gtalk: kongjianjun在gmail.com > > --~--~---------~--~----~------------~-------~--~----~ > 要退订此论坛请发邮件至 xiyoulinux-unsubscribe在googlegroups.com > 更多选项: http://groups.google.com/group/xiyoulinux?hl=zh-CN > 提问前建议您阅读:http://www.xiyoulinux.cn/blog/?p=64 > 也请查看我们的FAQ:http://xiyoulinux.cn/wiki/index.php?title=FAQ > -~----------~----~----~----~------~----~------~--~--- > > -- ------------------ running out of a problem is not a solution,sit and face it
2008年11月15日 星期六 15:18
On Sat, Nov 15, 2008 at 03:09:27PM +0800, Niu Tao wrote: >2008/11/15 Jianjun Kong <kongjianjun在gmail.com>: >> 使用Vim+Ctags+Cscope阅读源代码 .... >> $ cd linux-2.6.27.6 >> #进入源代码根目录 >> $ ctags -r >ctags -R Thanks. 已更新到:http://www.kongove.cn/web/doc/vim-ctags-cscope-source.html >> #递归生成标签文件 >> $ cscope-indexer -r >> #递归生成索引信息文件 >> $ cscope >> #使用cscope阅读源码 >> >> 标签文件、索引信息文件只需要第一次或者代码发生变动时生成,以后使用直接运行 >> cscope即可。 >> >> >> >> [1] http://sourcenav.sourceforge.net/ >> [2] http://www.sourceinsight.com/ >> [3] http://lxr.linux.no/ >> [4] http://cscope.sourceforge.net/ >> [5] http://vcd.gro.clinux.org/ -- Jianjun Kong @_@ Happy Hacking Homepage: http://kongove.cn/ Gtalk: kongjianjun在gmail.com
2008年11月16日 星期日 01:59
2008/11/15 Jianjun Kong <kongjianjun at gmail.com>: > > 最近有好几个人问我使用什么阅读源代码,网上查了一下,关于Vim+Ctags+Cscope阅读源码的资料很多,但有些讲得太简略,于是自己整理了一下。 > 欢迎任何改进反馈 ;) > ------------------- > > 使用Vim+Ctags+Cscope阅读源代码 > > --孔建军(Kongove.CN) > 2008.11.15 > > 代码阅读工具简介 > > 对于学习Linux内核的人来说,源代码的阅读尤为重要。因为所有设计思想、内部机制都是 > 以代码的形式实现,所有的资料也都是为了更好的诠释代码。那么一个好的阅读工具,能 > 够提高阅读的效率和效果。常见的代码阅读工具有,Source Navigator、Source Insight > 、lxr、Cscope等。 很明显你漏了Kscope,kde下很强大的工具,我个人认为比source navigator好多了。 > > • "Source Navigator"是红帽子公司的,以GNU GPL发布,可从官方网站[1]下载使用。 说实话,source navigator给我的印象很差。。。 > • "Source Insight"目前只有Windows平台的,官方网站[2]。需要注册才能使用,或者 > 从网上下载注册机生成注册码。在Linux下通过wine模拟虽然可以方便使用,但它毕竟 > 是Windows平台的东西,并不能很自由的使用。 既然如此那最好连提都别提。:-) > • lxr(linux cross reference)[3]为程序源代码建立索引数据库,利用perl脚本CGI动态 > 生成包含源码的web页面,你可以用任何一种浏览器查阅。缺点是需要服务器支持,还 > 有速度。 > • "Cscope"[4]为终端下的代码阅读工具,资源消耗少,对那些忠于命令行的行操作的人 > ,使用起来更加方便、灵活。这也是这篇文章推荐使用的一个重要原因。也有人把 > Cscope和Emasc绑定阅读源码。当然工具的选取,也取决于个人习惯。 > 再一次:所有这些工具都无法对函数指针进行跟踪(你知道为什么)。而grep在任何情况下 都可以。所以我现在基本上只用grep了。
2008年11月16日 星期日 10:33
On Sat, Nov 15, 2008 at 05:59:51PM +0000, Américo Wang wrote: >2008/11/15 Jianjun Kong <kongjianjun在gmail.com>: >> >> 最近有好几个人问我使用什么阅读源代码,网上查了一下,关于Vim+Ctags+Cscope阅读源码的资料很多,但有些讲得太简略,于是自己整理了一下。 >> 欢迎任何改进反馈 ;) >> ------------------- >> >> 使用Vim+Ctags+Cscope阅读源代码 >> >> --孔建军(Kongove.CN) >> 2008.11.15 >> >> 代码阅读工具简介 >> >> 对于学习Linux内核的人来说,源代码的阅读尤为重要。因为所有设计思想、内部机制都是 >> 以代码的形式实现,所有的资料也都是为了更好的诠释代码。那么一个好的阅读工具,能 >> 够提高阅读的效率和效果。常见的代码阅读工具有,Source Navigator、Source Insight >> 、lxr、Cscope等。 > > >很明显你漏了Kscope,kde下很强大的工具,我个人认为比source navigator好多了。 Thanks,已添加。 >> >> • "Source Navigator"是红帽子公司的,以GNU GPL发布,可从官方网站[1]下载使用。 > > >说实话,source navigator给我的印象很差。。。 > > >> • "Source Insight"目前只有Windows平台的,官方网站[2]。需要注册才能使用,或者 >> 从网上下载注册机生成注册码。在Linux下通过wine模拟虽然可以方便使用,但它毕竟 >> 是Windows平台的东西,并不能很自由的使用。 > >既然如此那最好连提都别提。:-) > > >> • lxr(linux cross reference)[3]为程序源代码建立索引数据库,利用perl脚本CGI动态 >> 生成包含源码的web页面,你可以用任何一种浏览器查阅。缺点是需要服务器支持,还 >> 有速度。 >> • "Cscope"[4]为终端下的代码阅读工具,资源消耗少,对那些忠于命令行的行操作的人 >> ,使用起来更加方便、灵活。这也是这篇文章推荐使用的一个重要原因。也有人把 >> Cscope和Emasc绑定阅读源码。当然工具的选取,也取决于个人习惯。 >> > >再一次:所有这些工具都无法对函数指针进行跟踪(你知道为什么)。而grep在任何情况下 >都可以。所以我现在基本上只用grep了。 这应该是词法分析的问题吧。 grep只要正则表达式用的灵活,当然也可以准确定位。 我测试了一下,确实不行,不能跟踪fun2。 如果用grep,可以通过正则表达式找到fun2的赋值语句(fun2=fun),然后在查找相应的定义函数。是这样吗? #include <stdio.h> int fun(char*s) { printf("%s\n", s); return 0; } int main(void) { // int fun(char*); int (*fun2)(char*); int a; fun2=fun; char str[]="abcdefghijklmn"; a=fun2(str); printf("a:%d\n", a); return 0; } -- Jianjun Kong @_@ Happy Hacking Homepage: http://kongove.cn/ Gtalk: kongjianjun在gmail.com
2008年11月17日 星期一 17:48
On Sun, Nov 16, 2008 at 10:33:13AM +0800, Jianjun Kong wrote: >> >>再一次:所有这些工具都无法对函数指针进行跟踪(你知道为什么)。而grep在任何情况下 >>都可以。所以我现在基本上只用grep了。 > >这应该是词法分析的问题吧。 >grep只要正则表达式用的灵活,当然也可以准确定位。 > 不是。 因为函数指针是动态赋值的,而这些源代码工具都是静态分析的。这才是根本原因。 -- "Sometimes the only way to stay sane is to go a little crazy."
Zeuux © 2024
京ICP备05028076号