源码阅读与分析方法

来源:互联网 发布:mysql分类汇总 编辑:程序博客网 时间:2024/05/01 11:22
参考:
1. http://www.cnblogs.com/ToDoToTry/archive/2009/06/21/1507760.html
2. http://www.xuebuyuan.com/475103.html
3. http://blog.csdn.net/sky04/article/details/5770553
 
读什么?
0. 前人总结的学习文档、笔记、心得体会。
1. 阅读源码的说明文档,比如源码中的README。
2. 如果源代码有文档目录,一般为doc或者docs, 最好也在阅读源程序之前仔细阅读。
3. 从makefile文件入手,分析源代码的层次结构,找出哪个是主程序,哪些是函数包。

怎么读?
1. 编译源码(将调试选项打开,将日志系统的编译选项打开,将 test/example 模块的编译选项打开) 。
     动手:编写编译的脚本或者文档。
2. 从 main 函数(如果是功能库的源码,那么从test/example 模块的 main 函数)入手,一步一步往下阅读,遇到可以猜测出意思来的简单的函数,可以跳过。
     动手:一定要注意程序中使用的全局变量(如果是C程序),可以把关键的数据结构说明整理到一个文本编辑器中以便随时查找。
3. 分析函数包(针对C程序),要注意哪些是全局函数,哪些是内部使用的函数,注意extern关键字。对于变量,也需要同样注意。先分析清楚内部函数,再来分析外部函数,因为内部函数肯定是在外部函数中被调用的。
4. 数据结构的重要性:对于一个C程序来说,所有的函数都是在操作同一些数据,而由于没有较好的封装性,这些数据可能出现在程序的任何地方,被任何函数修改,所以一定要注意这些数据的定义和意义,也要注意是哪些函数在对它们进行操作,做了哪些改变。
5. 源码的修改与调试是理解源码的重要方法,在修改的同时注意源码版本控制,前后对比更加高效。
     动手:修改源码后编译运行,结合日志等分析源码。
6. 从总体上梳理源码的模块划分,分析各模块所具备的功能以及相互依赖关系。
     动手:初步画出源码模块框图(存在略读及猜测)。
7. 分析具体模块,在分析开始之前猜测实现机制(猜不出也不要紧),带着验证的心态或者疑惑精读源码。
     动手:修改源码模块框图(框图是阅读效率的保证,且防止迷失于细节)。
     动手:源码阅读笔记集(源码设计分析、具体细节分析、感想)。
     动手:程序活动图、时序图等文档。
8. 可重用模块的积累。
     动手:整理可借鉴的架构设计,抽取可重用的软件模块,形成文档及代码(可用库及测试样例程序)。

读的思想准备和思路有哪些?
1. 不可避免的成为“老”代码的“接盘侠”。现成代码的继承、跳槽后新工作项目的适应等都需要阅读已有代码工程。
2. 从负面观点的被迫接收 转换为 极具正面价值的汲取养份”。
3. 先了解系统架构与行为模式,再细读
4. 代码阅读的三种程度:一、了解;二、修改,扩充;三、抽取,提炼。
5. 阅读程序码的重点,不在于读完每一行程序码,而是在于有效率地透过探索及阅读,从而了解系统的架构及行为模式。以便在你需要了解任何片段的细节实作时,能够很快在脑上对映到具体的程序码位置,直到那一刻,才是细读的时机
6. 了解架构,必须要加上层次感而不论是那一层级的架构,都会定义出各自的角色,以及角色间的关系。下列这件事是如何被完成的:一,系统如何初始化,二,与这个系统相接的其他系统(或使用者)有那些,而相接的介面又是什么;三,系统如何反应各种事件,四,系统如何处理各种异常及错误。


读的知识准备有哪些?
编程语言,代码命名规则,已积累的架构、经验等。

分析工具有哪些?
1. 好的IDE或者编辑器软件(source insight、sublime等)使阅读事半功倍。
2. grep,find等命令行文本搜索工具的使用。
3. gtags,htags等工具的使用(神器)
3. 调试选项的打开,日志系统的分析,关键打印的添加。
4. 代码分析工具(面向对象工程分析等)。

Unix/Linux 常见套路
1. 在程序开头,往往都是分析命令行,根据命令行参数对一些变量或者数组,或者结构赋值,后面的程序就是根据这些变量来进行不同的操作。 
2. 分析命令行之后,进行数据准备,往往是计数器清空,结构清零等等。
3. 在程序中间有一些预编译选项,可以在makefile中找到相应部分。
4. 注意程序中对于日志的处理,和调试选项打开的时候做的动作,这些对于调试程序有很大的帮助。
5. 注意多线程对数据的操作。

----------------------------------------------------------------------------------------

转载请附本文链接 http://blog.csdn.net/yongchurui/article/details/52464562

2016.09.07


0 0