源碼閱讀三劍客.vim配合ctags和cscope,足以在源代碼裏面自由翱翔,在函數和變量間自由跳轉. php
1 |
sudo apt-get install vim ctags cscope |
vim的使用就略過了,網上資料不少,不是一篇文章能說完的,將來我可能會寫一篇vim的使用心得
推薦一篇簡明 Vim 練級攻略,看完就差很少會用了. html
ctags的使用很簡單,vim已經內置了對ctags的支持
首先在源代碼根目錄執行ctags -R,遞歸的爲源碼創建tags,在根目錄會生成一個Tags的文件,存放各類函數和變量的tag,便於跳轉 java
對於簡單的代碼,ctags就夠用了,可是對於比較複雜的代碼來講,ctags顯得有點力不從心,因而,下一位劍客就登場了. git
vim一樣內置了對cscope的支持.
首先在源代碼根目錄執行cscope -Rbq,就會生成cscope.out文件(索引數據庫) 程序員
而後在vim中執行:cs add cscope.out,添加數據庫.
接下來就可使用:cs find x var進行查找.(x表明查詢選項,var表示要查找的函數或變量名)
cscope支持8種查詢方式 github
例如,咱們想在vim 7.0的源代碼中查找調用do_cscope()函數的函數,咱們能夠輸入:」:cs find c do_cscope「,回車後發現沒有找到匹配的功能,可能並無函數調用do_cscope()。咱們再輸入」:cs find s do_cscope「,查找這個C符號出現的位置,如今vim列出了這個符號出現的全部位置。 shell
每次都有輸入cs find來查找數據是否是有點麻煩,有沒有更方便的方法呢.固然有,vim的神奇之處在其可定製性.提供一份cscope的配置,將其放在.vimrc中便可. 數據庫
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " 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 <C-@>s :cs find s <C-R>=expand("<cword>")<CR><CR> nmap <C-@>g :cs find g <C-R>=expand("<cword>")<CR><CR> nmap <C-@>c :cs find c <C-R>=expand("<cword>")<CR><CR> nmap <C-@>t :cs find t <C-R>=expand("<cword>")<CR><CR> nmap <C-@>e :cs find e <C-R>=expand("<cword>")<CR><CR> nmap <C-@>f :cs find f <C-R>=expand("<cfile>")<CR><CR> nmap <C-@>i :cs find i ^<C-R>=expand("<cfile>")<CR>$<CR> nmap <C-@>d :cs find d <C-R>=expand("<cword>")<CR><CR> |
上面的配置即把Ctrl + @做爲 :cs find的快捷鍵,也就是說要查找某個函數名,只須要把光標放在函數名上,按下Ctrl + @ + s便可,簡直不能更方便.並且你能夠本身修改配置,映射到本身以爲舒服的快捷鍵上. ubuntu
本着不重複造輪子的原則,我就簡單的寫了cscope的基本用法,其實基本上就夠用了,進階的用法參考這篇文章vi/vim使用進階: 程序員的利器 – cscope vim
上面咱們講的是用vim來查看源代碼,可是面對幾十萬代碼的時候,想要看清楚各個結構體之間的關係就不是vim可以作到的了.這時候咱們就須要doxygen來幫手了.
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是一個根據源代碼生成文檔的工具,這貨雖然主要是給C++用的,可是它也對其餘語言有支持.
安裝直接去官網,按照其指導安裝便可
下面介紹一下doxygen的使用方法.
首先,在源代碼根目錄執行doxygen -g,而後在根目錄就會忽然冒出一個名爲Doxyfile的文件,這個文件就是doxygen生成文檔的配置文件了.
那麼,重點來了,怎麼配置這個文件,默認的配置是根據代碼生成各個結構體的成員數據,而後生成html和latex兩個文件夾,分別是網頁和latex文檔.
說實話,默認生成的文檔並無什麼卵用,除了讓你更方便的看到各個結構體的組成成員.咱們關心的是各個結構體之間的關係,這是針對C而言的.對與C++和java而言,關心的是類之間的關係.因此,默認的配置確定是要修改的.至於怎麼改,看官方文檔.
固然了,若是這篇文章惟一給出的建議就是看文檔,那這篇文章有什麼意義呢.你們都知道看文檔能夠解決問題,可是時間成本過高,並且是英文的.寫這篇文章的目的是分享本身學習獲得的經驗,讓你們少走彎路,若是不能解決你的問題,只能去看文檔了
接下來我根據我本身看文檔用到的配置跟你們解釋一下.
首先,Doxygen裏面的配置可謂又臭又長,你絕對不會有讀完它的慾望.因此我給出幾個關鍵的配置項,到時候搜索它修改便可
這是針對各類語言優化輸出的選項,默認都是NO,由於它不清楚你用的是什麼語言(話說看一下後綴不就知道了嗎…)
1 2 3 4 |
OPTIMIZE_OUTPUT_FOR_C OPTIMIZE_OUTPUT_JAVA OPTIMIZE_FOR_FORTRAN OPTIMIZE_OUTPUT_VHDL |
這個是生成文檔的類型的選項,默認生成html和latex,共支持六種類型的文檔,每種類型的生成配置也是不少,具體根據須要配置
1 2 3 4 5 6 |
GENERATE_HTML GENERATE_LATEX GENERATE_RTF GENERATE_XML GENERATE_DOCBOOK GENERATE_MAN |
關於生成圖像的選項.doxygen使用dot這個工具來繪圖,因此要先執行sudo apt-get install graphviz安裝dot.在設置好這個繪圖選項以後,doxygen就會生成各個結構體的關係,對於類會生成函數調用關係(我沒試過,由於只試過C的).
1 2 3 4 5 6 7 8 |
HAVE_DOT (必定要置爲YES,後面的選項都依賴這個) DOT_NUM_THREADS (使用dot繪圖的線程數量,越多越快,我通常是設置跟cpu的核數同樣) //如下兩個選項跟生成函數調用關係圖有關 CALL_GRAPH CALLER_GRAPH EXTRACT_ALL //把全部實體都輸出到文檔,無論它是否能被描述 EXTRACT_STATIC //把靜態變量也輸出到文檔中 EXTRACT_PRIVATE //把私有變量也輸出到文檔中 |
給一個結構體關係圖,就是doxygen生成的.
[machine_class]關於源碼搜索路徑,默認是搜索本目錄的源代碼,大部分狀況下源碼是分佈在各個子目錄的.
1 |
RECURSIVE = YES |
默認RECURSIVE是NO,因此記得把它設置爲YES,遞歸搜索子目錄. 感謝soglad的留言提醒
最後一步,在源碼根目錄執行doxygen,它會自動找到Doxygen配置,根據配置生成文檔.
最後一個工具,大名鼎鼎的gdb.分析源碼執行流程的最好方式的是運行它,而後一步步執行.用來觀察它最好的工具固然是gdb了(針對C/C++).
gdb的使用我也不打算造輪子,直接參考用GDB調試程序,這篇寫的很好,通俗易懂.
以上就是我在閱讀源碼的時候使用的Linux工具,三劍客vim+ctags+cscope,兩板斧doxygen gdb,足以馳騁源代碼的江湖.
以上工具,vim和gdb是最難學的,學習曲線很陡峭.可是學好以後,就能守得雲開見月明.
參考文章,感謝幫助
vi/vim使用進階: 程序員的利器 – cscope