新聞中心
前言

成都創(chuàng)新互聯(lián)是專業(yè)的趙縣網(wǎng)站建設(shè)公司,趙縣接單;提供網(wǎng)站建設(shè)、成都網(wǎng)站制作,網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行趙縣網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!
看源代碼是一個(gè)程序員必須經(jīng)歷的事情,也是可以提升能力的一個(gè)捷徑。個(gè)人認(rèn)為: 要完全掌握一個(gè)軟件的方法只有閱讀源碼。
在Windows下有sourceinsight這個(gè)源碼閱讀軟件(雖然我沒(méi)用過(guò),但是網(wǎng)上評(píng)價(jià)還不錯(cuò)),由于我是個(gè)Linuxer,并不喜歡用Windows,所以自然是選擇在Linux下閱讀源碼的工具了。
下面我將逐一介紹在Linux下閱讀源碼的工具。
vim+ctags+cscope
源碼閱讀三劍客:vim配合ctags和cscope,足以在源代碼里面自由翱翔,在函數(shù)和變量間自由跳轉(zhuǎn)。
安裝
sudo apt-get install vim ctags cscope
vim
vim的使用就略過(guò)了,網(wǎng)上資料很多,不是一篇文章能說(shuō)完的,未來(lái)我可能會(huì)寫(xiě)一篇vim的使用心得。推薦一篇簡(jiǎn)明 Vim 練級(jí)攻略,看完就差不多會(huì)用了。
ctags
ctags的使用很簡(jiǎn)單,vim已經(jīng)內(nèi)置了對(duì)ctags的支持。
首先在源代碼根目錄執(zhí)行ctags -R,遞歸的為源碼建立tags,在根目錄會(huì)生成一個(gè)Tags的文件,存放各種函數(shù)和變量的tag,便于跳轉(zhuǎn):
-
使光標(biāo)在函數(shù)或變量上,Ctrl + ]即可跳轉(zhuǎn)到其定義處
-
Ctrl + t可以回到你跳轉(zhuǎn)之前的位置
對(duì)于簡(jiǎn)單的代碼,ctags就夠用了,但是對(duì)于比較復(fù)雜的代碼來(lái)說(shuō),ctags顯得有點(diǎn)力不從心,于是,下一位劍客就登場(chǎng)了。
cscope
vim同樣內(nèi)置了對(duì)cscope的支持。
首先在源代碼根目錄執(zhí)行cscope -Rbq,就會(huì)生成cscope.out文件(索引數(shù)據(jù)庫(kù))
-
-R: 在生成索引文件時(shí),搜索子目錄樹(shù)中的代碼
-
-b: 只生成索引文件,不進(jìn)入cscope的界面
-
-q: 生成cscope.in.out和cscope.po.out文件,加快cscope的索引速度
然后在vim中執(zhí)行:cs add cscope.out,添加數(shù)據(jù)庫(kù)。
接下來(lái)就可以使用:cs find x var進(jìn)行查找。(x代表查詢選項(xiàng),var表示要查找的函數(shù)或變量名)
cscope支持8種查詢方式
-
s: 查找C語(yǔ)言符號(hào),即查找函數(shù)名、宏、枚舉值等出現(xiàn)的地方
-
g: 查找函數(shù)、宏、枚舉等定義的位置,類似ctags所提供的功能
-
d: 查找本函數(shù)調(diào)用的函數(shù)
-
c: 查找調(diào)用本函數(shù)的函數(shù)
-
t: 查找指定的字符串
-
e: 查找egrep模式,相當(dāng)于egrep功能,但查找速度快多了
-
f: 查找并打開(kāi)文件,類似vim的find功能
-
i: 查找包含本文件的文件
例如,我們想在vim 7.0的源代碼中查找調(diào)用do_cscope()函數(shù)的函數(shù),我們可以輸入:”:cs find c do_cscope“,回車(chē)后發(fā)現(xiàn)沒(méi)有找到匹配的功能,可能并沒(méi)有函數(shù)調(diào)用do_cscope()。我們?cè)佥斎搿?cs find s do_cscope“,查找這個(gè)C符號(hào)出現(xiàn)的位置,現(xiàn)在vim列出了這個(gè)符號(hào)出現(xiàn)的所有位置。
每次都有輸入cs find來(lái)查找數(shù)據(jù)是不是有點(diǎn)麻煩,有沒(méi)有更方便的方法呢。當(dāng)然有,vim的神奇之處在其可定制性。提供一份cscope的配置,將其放在.vimrc中即可。
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" cscope setting
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
if has("cscope")
set csprg=/usr/bin/cscope
set csto=1
set cst
set nocsverb
" add any database in current directory
if filereadable("cscope.out")
cs add cscope.out
endif
set csverb
endif
nmap
nmap
nmap
nmap
nmap
nmap
nmap
nmap
上面的配置即把Ctrl + @作為:cs find的快捷鍵,也就是說(shuō)要查找某個(gè)函數(shù)名,只需要把光標(biāo)放在函數(shù)名上,按下Ctrl + @ + s即可,簡(jiǎn)直不能更方便。而且你可以自己修改配置,映射到自己覺(jué)得舒服的快捷鍵上。
本著不重復(fù)造輪子的原則,我就簡(jiǎn)單的寫(xiě)了cscope的基本用法,其實(shí)基本上就夠用了,進(jìn)階的用法參考這篇文章vi/vim使用進(jìn)階: 程序員的利器 – cscope。
doxygen
上面我們講的是用vim來(lái)查看源代碼,但是面對(duì)幾十萬(wàn)代碼的時(shí)候,想要看清楚各個(gè)結(jié)構(gòu)體之間的關(guān)系就不是vim能夠做到的了。這時(shí)候我們就需要doxygen來(lái)幫手了。
Doxygen is the de facto standard tool for generating documentation from annotated C++ sources, but it also supports other popular programming languages such as C, Objective-C, C#, PHP, Java, Python, IDL (Corba, Microsoft, and UNO/OpenOffice flavors), Fortran, VHDL, Tcl, and to some extent D.
doxygen是一個(gè)根據(jù)源代碼生成文檔的工具,這貨雖然主要是給C++用的,但是它也對(duì)其他語(yǔ)言有支持。
安裝直接去官網(wǎng),按照其指導(dǎo)安裝即可。
下面介紹一下doxygen的使用方法。
首先,在源代碼根目錄執(zhí)行doxygen -g,然后在根目錄就會(huì)突然冒出一個(gè)名為Doxyfile的文件,這個(gè)文件就是doxygen生成文檔的配置文件了。
那么,重點(diǎn)來(lái)了,怎么配置這個(gè)文件,默認(rèn)的配置是根據(jù)代碼生成各個(gè)結(jié)構(gòu)體的成員數(shù)據(jù),然后生成html和latex兩個(gè)文件夾,分別是網(wǎng)頁(yè)和latex文檔。
說(shuō)實(shí)話,默認(rèn)生成的文檔并沒(méi)有什么卵用,除了讓你更方便的看到各個(gè)結(jié)構(gòu)體的組成成員。我們關(guān)心的是各個(gè)結(jié)構(gòu)體之間的關(guān)系,這是針對(duì)C而言的。對(duì)與C++和java而言,關(guān)心的是類之間的關(guān)系。所以,默認(rèn)的配置肯定是要修改的。至于怎么改,看官方文檔。
當(dāng)然了,如果這篇文章唯一給出的建議就是看文檔,那這篇文章有什么意義呢。大家都知道看文檔可以解決問(wèn)題,但是時(shí)間成本太高,而且是英文的。寫(xiě)這篇文章的目的是分享自己學(xué)習(xí)得到的經(jīng)驗(yàn),讓大家少走彎路,如果不能解決你的問(wèn)題,只能去看文檔了。
接下來(lái)我根據(jù)我自己看文檔用到的配置跟大家解釋一下。
首先,Doxygen里面的配置可謂又臭又長(zhǎng),你絕對(duì)不會(huì)有讀完它的欲望。所以我給出幾個(gè)關(guān)鍵的配置項(xiàng),到時(shí)候搜索它修改即可
-
這是針對(duì)各種語(yǔ)言優(yōu)化輸出的選項(xiàng),默認(rèn)都是NO,因?yàn)樗磺宄阌玫氖鞘裁凑Z(yǔ)言(話說(shuō)看一下后綴不就知道了嗎…)
OPTIMIZE_OUTPUT_FOR_C
OPTIMIZE_OUTPUT_JAVA
OPTIMIZE_FOR_FORTRAN
OPTIMIZE_OUTPUT_VHDL -
這個(gè)是生成文檔的類型的選項(xiàng),默認(rèn)生成html和latex,共支持六種類型的文檔,每種類型的生成配置也是很多,具體根據(jù)需要配置
GENERATE_HTML
GENERATE_LATEX
GENERATE_RTF
GENERATE_XML
GENERATE_DOCBOOK
GENERATE_MAN -
關(guān)于生成圖像的選項(xiàng)。doxygen使用dot這個(gè)工具來(lái)繪圖,所以要先執(zhí)行sudo apt-get install graphviz安裝dot。在設(shè)置好這個(gè)繪圖選項(xiàng)之后,doxygen就會(huì)生成各個(gè)結(jié)構(gòu)體的關(guān)系,對(duì)于類會(huì)生成函數(shù)調(diào)用關(guān)系(我沒(méi)試過(guò),因?yàn)橹辉囘^(guò)C 的)。
HAVE_DOT (一定要置為YES,后面的選項(xiàng)都依賴這個(gè))
DOT_NUM_THREADS (使用dot繪圖的線程數(shù)量,越多越快,我一般是設(shè)置跟cpu的核數(shù)一樣)
給一個(gè)結(jié)構(gòu)體關(guān)系圖,就是doxygen生成的。
[machine_class]
最后一步,在源碼根目錄執(zhí)行doxygen,它會(huì)自動(dòng)找到Doxygen配置,根據(jù)配置生成文檔。
gdb
最后一個(gè)工具,大名鼎鼎的gdb。分析源碼執(zhí)行流程的最好方式的是運(yùn)行它,然后一步步執(zhí)行。用來(lái)觀察它最好的工具當(dāng)然是gdb了(針對(duì)C/C++)。
gdb的使用我也不打算造輪子,直接參考用GDB調(diào)試程序,這篇寫(xiě)的很好,通俗易懂。
后記
以上就是我在閱讀源碼的時(shí)候使用的Linux工具,三劍客vim+ctags+cscope,兩板斧doxygen gdb,足以馳騁源代碼的江湖。
以上工具,vim和gdb是最難學(xué)的,學(xué)習(xí)曲線很陡峭。但是學(xué)好之后,就能守得云開(kāi)見(jiàn)月明。
文章標(biāo)題:Linux源代碼分析工具鏈
當(dāng)前地址:http://www.5511xx.com/article/ccdpeho.html


咨詢
建站咨詢
