继续从深入分析开源代码说起,当然源码分析没有太多捷径可走。笔者只是探讨下,如何分析会更好些。特通过Samba技术邮件群组,向老外提问“如何更好的分析Samba源码”。
以下是老外回复的翻译,针对Samba源码说的,但对所有的开源代码的分析原理相通,都可以拿来借鉴、消化吸收。
一、研究开源代码,老外说
一些人们用来研究Samba源码的想法:
1、使用论坛中提及代码浏览技术(我现在使用GNU Global + vim,过去使用OpenGrok,并且将来还会用)来轻松地在代码间跳转,弄清楚“这个函数的功能是什么”以及“谁调用了这个函数”是至关重要的。
2、以你想要运行的方式“动起来”研究源码。可以使用类似systemtap,ktap和dtrace的工具(我在SambaXP对后者写了一个简报)。更深入的了解哪些文件被打开了,运行时的调用堆栈是什么,怎么样读取/写入文件等等……
祝你在研究中好运!
二、解读老外回复关键词
就邮件中老外的几个关键词解读如下:
1、gnu global是一个类似cscope的工具,也能提供源文件之间的交叉索引。其独到之处在于,当你生成索引文件以后,再修改整个项目里的一个文件,然后增量索引的过程非常快。
2、OpenGrok是源代码分析利器,速度比SourceInsight快很多。
3、SystemTap是监控和跟踪运行中的Linux 内核的操作的动态方法。
4、ktap是一种新的基于脚本的动态跟踪工具,用于Linux的,它使用一种脚本语言,并允许用户动态跟踪Linux内核。类似SystemTap、Solaris DTrace工具。它不依赖于GCC,不需要编译内核模块为每个脚本,实现了嵌入式系统的跟踪需要。
5、SambaXP对应http://sambaxp.org/,是Samba用户和开发者的技术会议,用于讨论新的需求、新的特征、获取新的技术更新。
三、个人见解
正如老外回复,核心点有二个。
1、代码分析工具。便于代码之间进行跳转,因为代码是死的,手动的方式去查阅调用逻辑关系费时、费力,效率极其低下。笔者的经验是将其编译为一个大工程,笔者最初用的是SourceInsight,其间发现有些函数的跳转不顺畅。后来将整个工程置于VS2010下,虽庞大,但查询函数调用一层一层还是很有用的。
笔者发现,开源代码有的时候单独一个函数代码行数多、函数参数巨多。举例来讲,Samba源码中有一个函数有近1000行代码的,有一个函数有近20个参数的。这样的话,就需要我们从纵向、横向两个方向分析源码。横向分析函数调用逻辑,纵向分析参数在函数中如何使用的。其中,纵向分析,可以使用NodePad++,他可以在一个文件检索关键词,并会将检索结果的索引列举在最下方,很直观、很方便。
2、让代码“动起来”。这点可以通过gdb单步调试跟踪函数调用逻辑,可以打印函数调用堆栈,可以通过strace跟踪文件打开、读写操作。
笔者补充一点,“日志文件”的分析也是至关重要的。Samba源码一般在/usr/local/samba/etc/smb.conf文件中,可以将loglevel设置为1-10,一般3,5,10的日志级别是常用的,日志级别越高,打印的日志越详细,越便于我们分析源码调用。
附老外回复原文:
Some thoughts for people studying Samba:
1. Use code browsing technology of some form. (I use GNU Global + vim right now. I've used OpenGrok in the past, and will again.) The ability to easily jump around the code, and ask "what does that function do" is critical. Also to ask "What calls this function."
2. Study the system live, running the way you want. Use tools like systemtap, ktap, and dtrace (I've written a presentation on the latter, that I gave at SambaXP.) to gain insight into what files are being opened, what is the call stack when it happens? What about reads/writes? Etc...
Good luck in your search,
开源代码博大精深,源码分析的乐趣当然令大家神往。笔者总结列举了几个方法了,你使用了几个呢?
2013-11-23 am9:51思于家中床前
推荐阅读:
【1】开源代码分析技巧之一——打印调用逻辑
http://blog.csdn.net/laoyang360/article/details/12676131
【2】开源代码分析技巧之二——gdb单步调试
http://blog.csdn.net/laoyang360/article/details/14102181
【4】开源代码分析技巧之四——国外技术社区提问
http://blog.csdn.net/laoyang360/article/details/16897827
【5】开源代码分析技巧之四——高效Windows源码分析
http://blog.csdn.net/laoyang360/article/details/18186529