Linux原始碼分析工具鏈

來源:互聯網
上載者:User

Linux原始碼分析工具鏈
前言

看原始碼是一個程式員必須經曆的事情,也是可以提升能力的一個捷徑。個人認為: 要完全掌握一個軟體的方法只有閱讀源碼。

在Windows下有sourceinsight這個源碼閱讀軟體(雖然我沒用過,但是網上評價還不錯),由於我是個Linuxer,並不喜歡用Windows,所以自然是選擇在Linux下閱讀源碼的工具了。

下面我將逐一介紹在Linux下閱讀源碼的工具。

 

vim+ctags+cscope

源碼閱讀三劍客:vim配合ctags和cscope,足以在原始碼裡面自由翱翔,在函數和變數間自由跳轉。

 

安裝
  1. sudo apt-get install vim ctags cscope

 

vim

vim的使用就略過了,網上資料很多,不是一篇文章能說完的,未來我可能會寫一篇vim的使用心得。推薦一篇簡明 Vim 練級攻略,看完就差不多會用了。

 

ctags

ctags的使用很簡單,vim已經內建了對ctags的支援。

首先在原始碼根目錄執行ctags -R,遞迴的為源碼建立tags,在根目錄會產生一個Tags的檔案,存放各種函數和變數的tag,便於跳轉:

  • 使游標在函數或變數上,Ctrl + ]即可跳轉到其定義處
  • Ctrl + t可以回到你跳轉之前的位置

對於簡單的代碼,ctags就夠用了,但是對於比較複雜的代碼來說,ctags顯得有點力不從心,於是,下一位劍客就登場了。

 

cscope

vim同樣內建了對cscope的支援。

首先在原始碼根目錄執行cscope -Rbq,就會產生cscope.out檔案(索引資料庫)

  • -R: 在產生索引檔案時,搜尋子目錄樹中的代碼
  • -b: 只產生索引檔案,不進入cscope的介面
  • -q: 產生cscope.in.out和cscope.po.out檔案,加快cscope的索引速度

然後在vim中執行:cs add cscope.out,添加資料庫。

接下來就可以使用:cs find x var進行尋找。(x代表查詢選項,var表示要尋找的函數或變數名)

cscope支援8種查詢方式

  • s: 尋找C語言符號,即尋找函數名、宏、枚舉值等出現的地方
  • g: 尋找函數、宏、枚舉等定義的位置,類似ctags所提供的功能
  • d: 尋找本函數調用的函數
  • c: 尋找調用本函數的函數
  • t: 尋找指定的字串
  • e: 尋找egrep模式,相當於egrep功能,但尋找速度快多了
  • f: 尋找並開啟檔案,類似vim的find功能
  • i: 尋找包含本檔案的檔案

例如,我們想在vim 7.0的原始碼中尋找調用do_cscope()函數的函數,我們可以輸入:”:cs find c do_cscope“,斷行符號後發現沒有找到匹配的功能,可能並沒有函數調用do_cscope()。我們再輸入”:cs find s do_cscope“,尋找這個C符號出現的位置,現在vim列出了這個符號出現的所有位置。

每次都有輸入cs find來尋找資料是不是有點麻煩,有沒有更方便的方法呢。當然有,vim的神奇之處在其可定製性。提供一份cscope的配置,將其放在.vimrc中即可。

  1. """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
  2. " cscope setting
  3. """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
  4. if has("cscope")
  5. set csprg=/usr/bin/cscope
  6. set csto=1
  7. set cst
  8. set nocsverb
  9. " add any database in current directory
  10. if filereadable("cscope.out")
  11. cs add cscope.out
  12. endif
  13. set csverb
  14. endif
  15. nmap <C-@>s :cs find s <C-R>=expand("<cword>")<CR><CR>
  16. nmap <C-@>g :cs find g <C-R>=expand("<cword>")<CR><CR>
  17. nmap <C-@>c :cs find c <C-R>=expand("<cword>")<CR><CR>
  18. nmap <C-@>t :cs find t <C-R>=expand("<cword>")<CR><CR>
  19. nmap <C-@>e :cs find e <C-R>=expand("<cword>")<CR><CR>
  20. nmap <C-@>f :cs find f <C-R>=expand("<cfile>")<CR><CR>
  21. nmap <C-@>i :cs find i ^<C-R>=expand("<cfile>")<CR>$<CR>
  22. nmap <C-@>d :cs find d <C-R>=expand("<cword>")<CR><CR>

上面的配置即把Ctrl + @作為:cs find的快速鍵,也就是說要尋找某個函數名,只需要把游標放在函數名上,按下Ctrl + @ + s即可,簡直不能更方便。而且你可以自己修改配置,映射到自己覺得舒服的快速鍵上。

本著不重複造輪子的原則,我就簡單的寫了cscope的基本用法,其實基本上就夠用了,進階的用法參考這篇文章vi/vim使用進階: 程式員的利器 – cscope。

 

doxygen

上面我們講的是用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. OPTIMIZE_OUTPUT_FOR_C
    2. OPTIMIZE_OUTPUT_JAVA
    3. OPTIMIZE_FOR_FORTRAN
    4. OPTIMIZE_OUTPUT_VHDL
  • 這個是產生文檔的類型的選項,預設產生html和latex,共支援六種類型的文檔,每種類型的組建組態也是很多,具體根據需要配置

    1. GENERATE_HTML
    2. GENERATE_LATEX
    3. GENERATE_RTF
    4. GENERATE_XML
    5. GENERATE_DOCBOOK
    6. GENERATE_MAN
  • 關於產生映像的選項。doxygen使用dot這個工具來繪圖,所以要先執行sudo apt-get install graphviz安裝dot。在設定好這個繪圖選項之後,doxygen就會產生各個結構體的關係,對於類會產生函數調用關係(我沒試過,因為只試過C的)。

    1. HAVE_DOT (一定要置為YES,後面的選項都依賴這個)
    2. DOT_NUM_THREADS (使用dot繪圖的線程數量,越多越快,我一般是設定跟cpu的核心數一樣)

給一個結構體關係圖,就是doxygen產生的。

[machine_class]

最後一步,在源碼根目錄執行doxygen,它會自動找到Doxygen配置,根據配置產生文檔。

 

gdb

最後一個工具,大名鼎鼎的gdb。分析源碼執行流程的最好方式的是運行它,然後一步步執行。用來觀察它最好的工具當然是gdb了(針對C/C++)。

gdb的使用我也不打算造輪子,直接參考用GDB偵錯工具,這篇寫的很好,通俗易懂。

 

後記

以上就是我在閱讀源碼的時候使用的Linux工具,三劍客vim+ctags+cscope,兩板斧doxygen gdb,足以馳騁原始碼的江湖。

以上工具,vim和gdb是最難學的,學習曲線很陡峭。但是學好之後,就能守得雲開見月明。

本文永久更新連結地址:

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.