關(guān)于閱讀開源項(xiàng)目的源碼思路方法:《不喜勿噴》
一般開源項(xiàng)目, 如果這個項(xiàng)目你很熟悉經(jīng)常用, 那么你直接從 main 入手沒問題.爵政。
如果你不熟悉或者代碼量很大, 最好從代碼的 example 代碼 或者 client 的代碼入手比較容易. 這些代碼直接 gdb 進(jìn)去就可以調(diào)試運(yùn)行了, 客戶端的功能搞清楚了,會用了, 恐懼感就降下去了, 再看服務(wù)端就容易了.
看 c 代碼要 關(guān)注主體核心 struct , 整個server, client 可能都是圍繞整個 struct 運(yùn)行起來的, 這個struct 的指針 傳來傳去. 而看 java 代碼 就需要關(guān)注最主要的 interface, 通過 interface
看繼承類.
有的人喜歡微觀從main開始看,有的喜歡宏觀先看數(shù)據(jù)結(jié)構(gòu)(接口), 這個都可以.
另外看網(wǎng)絡(luò)代碼,最要關(guān)注的就是 何時 listen, 何時 accept, epoll_ctl 注入的幾個函數(shù)是誰,對應(yīng)java 里就是 selector 之后的幾個讀寫函數(shù). 找到這幾個函數(shù),基本網(wǎng)絡(luò)框架就理解了, 網(wǎng)絡(luò)模型就那么幾種.
看網(wǎng)絡(luò)協(xié)議包處理函數(shù)可以讓你更好的理解干巴巴的協(xié)議.
看? help 函數(shù) 可以更快的知道 如何使用.
如果代碼不好調(diào)試, 根據(jù)程序運(yùn)行的日志輸出, 在代碼里找日志輸出點(diǎn)也是一種方法.
自己寫一個 cscope.sh 腳本, 放到path里, 代碼下載下來在主目錄運(yùn)行一下就可以開看了.
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 看代碼, 反復(fù)進(jìn)去退出, 寫個 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 里輸入?yún)?shù)多麻煩阿.
vim 的 ctags, cscop只能利用symbol 來查找還是弱了一點(diǎn), 用 eclipse 看 java 就更加方便了, 看 擴(kuò)展類, 看調(diào)用關(guān)系都是一個右鍵可以搞定的. java 項(xiàng)目可以利用 maven 把依賴的jar的 source 都下下來.
我一般習(xí)慣左邊顯示器開代碼(vim, eclipse). 右邊我一般會開個 xmind, dia 或者 luchidchart, griffly 畫畫uml流程時序圖什么的.尤其多線程的程序, 各種 lock 和 queue 調(diào)用, 你沒有圖比較難理清楚思路. 紙筆有的時候更加效果.
個人覺得代碼比看書更應(yīng)該有產(chǎn)出, 我們可以看閑書一掃而過, 看代碼最好還是記點(diǎn)筆記, 畫個圖. 方便回憶,方便continued.? 如果想保護(hù)自己開源項(xiàng)目的源碼不被逆向,詳情了解路翻,愛加密教你Android APP如何防止二次打包http://www.ijiami.cn/newsInfo?id=280&v=3