分享》:关于阅读开源项目的源码思路方法
关于阅读开源项目的源码思路方法:《不喜勿喷》
一般开源项目, 如果这个项目你很熟悉经常用, 那么你直接从 main 入手没问题.。
如果你不熟悉或者代码量很大, 最好从代码的 example 代码 或者 client 的代码入手比较容易. 这些代码直接 gdb 进去就可以调试运行了, 客户端的功能搞清楚了,会用了, 恐惧感就降下去了, 再看服务端就容易了.
看 c 代码要 关注主体核心 struct , 整个server, client 可能都是围绕整个 struct 运行起来的, 这个struct 的指针 传来传去. 而看 java 代码 就需要关注最主要的 interface, 通过 interface
看继承类.
有的人喜欢微观从main开始看,有的喜欢宏观先看数据结构(接口), 这个都可以.
另外看网络代码,最要关注的就是 何时 listen, 何时 accept, epoll_ctl 注入的几个函数是谁,对应java 里就是 selector 之后的几个读写函数. 找到这几个函数,基本网络框架就理解了, 网络模型就那么几种.
看网络协议包处理函数可以让你更好的理解干巴巴的协议.
看 help 函数 可以更快的知道 如何使用.
如果代码不好调试, 根据程序运行的日志输出, 在代码里找日志输出点也是一种方法.
自己写一个 cscope.sh 脚本, 放到path里, 代码下载下来在主目录运行一下就可以开看了.
find . -name "*.h" -o -name "*.c" -o -name "*.py" -o -name "*.lua" -o -name "*.erl" -o -name "*.hrl" -name "*.java" >> cscope.files
cscope -bkq -i cscope.files
ctags -R
ctags -I __THROW --langmap=c:+.h --languages=c --c-kinds=+p --if0=yes --exclude=java --file-scope=yes -f systemtags /usr/include/* /usr/include/sys/*
用 gdb 看代码, 反复进去退出, 写个 macro file 也是不错的
b main
r --user=mysql --gdb --basedir=/usr/local/mysql --datadir=/usr/local/mysql/var --log-error=/usr/local/mysql/var/hoterran-laptop.err --pid-file=/usr/local/mysql/var/hoterran-laptop.pid
set scheduler-locking off
gdb -x macro-file libexec/mysqld
gdb --args 挺好用的, 很多人喜欢在 gdb 里输入参数多麻烦阿.
vim 的 ctags, cscop只能利用symbol 来查找还是弱了一点, 用 eclipse 看 java 就更加方便了, 看 扩展类, 看调用关系都是一个右键可以搞定的. java 项目可以利用 maven 把依赖的jar的 source 都下下来.
我一般习惯左边显示器开代码(vim, eclipse). 右边我一般会开个 xmind, dia 或者 luchidchart, griffly 画画uml流程时序图什么的.尤其多线程的程序, 各种 lock 和 queue 调用, 你没有图比较难理清楚思路. 纸笔有的时候更加效果.
个人觉得代码比看书更应该有产出, 我们可以看闲书一扫而过, 看代码最好还是记点笔记, 画个图. 方便回忆,方便continued. 如果想保护自己开源项目的源码不被逆向,详情了解,爱加密教你Android APP如何防止二次打包http://www.ijiami.cn/newsInfo?id=280&v=3