代碼閱讀工具簡介
對于學習Linux內核的人來說,源代碼的閱讀尤為重要。因為所有設計思想、內部機制都是
以代碼的形式實現,所有的資料也都是為了更好的詮釋代碼。那么一個好的閱讀工具,能
夠提高閱讀的效率和效果。常見的代碼閱讀工具有,Source Navigator、Source Insight
、lxr、Cscope、Kscope等。
• "Source Navigator"是紅帽子公司的,以GNU GPL發布,可從官方網站[1]下載使用。
• "Source Insight"目前只有Windows平臺的,官方網站[2]。需要注冊才能使用,或者
從網上下載注冊機生成注冊碼。在Linux下通過wine模擬雖然可以方便使用,但它畢竟
是Windows平臺的東西,并不能很自由的使用。
• lxr(linux cross reference)[3]為程序源代碼建立索引數據庫,利用perl腳本CGI動態
生成包含源碼的web頁面,你可以用任何一種瀏覽器查閱。缺點是需要服務器支持,還
有速度。
• "Cscope"[4]為終端下的代碼閱讀工具,資源消耗少,對那些忠于命令行的行操作的人
,使用起來更加方便、靈活。這也是這篇文章推薦使用的一個重要原因。也有人把
Cscope和Emasc綁定閱讀源碼。當然工具的選取,也取決于個人習慣。
Vim+Ctags+Cscope
cscope的工作需要vim、ctags的配合,它們都是基于命令行的。在Ubuntu下,用戶只需執
行“sudo apt-get install cscope cscope-indexer ctags vim-full”即可完成軟件安裝。
下面只是給出了三種工具的常用方法,更多功能可查看man手冊,或者官方文檔。
Vim
vim被看作是專門為程序員打造的文本編輯器,其豐富的編輯命令都是常用的簡單字符,用
戶很容易上手。vim可對180多種語言的語法高亮,對C語言自動縮進,真則表達式字符匹配
查找,功能強大,并支持多個操作系統平臺。關于vim的使用,這里不做講解。vim中文文
檔[5]。
在Ubuntu下默認安裝的vim,沒有語法加亮功能。所以需要安裝vim-full,并在vim 配置
文件 ~/.vimrc中添加一行 "syntax on" 這樣在vim中打開的源碼就有了語法高亮顯示。
vim自帶了很多顏色主題,可以直接選取下面一行添加到vim配置文件當中,重新打開vim即
可生效。
colorscheme elflord "我使用這個
colorscheme darkblue
colorscheme evening
colorscheme murphy
colorscheme torte
colorscheme desert
Ctags
在源代碼根目錄下執行 ctags -r 命令用來為程序源代碼生成標簽文件,其-r選項表示遞
歸操作,同時為子目錄也生成標簽文件。vim利用生成的標簽文件,可以進行相應檢索、并
在不同的文件C語言元素之間來回切換。
在vim中ctags的簡單使用
1) 跳轉到指定的函數進入vim后,用 “:tag func_name“ 跳到函數func_name處。使用tag
命令時,可以使用TAB鍵進行匹配查找,繼續按TAB鍵向下切換。
某個函數有多個定義時
:tag
跳到第一個定義處,優先跳轉到當前文件
:tnext
跳到第一個
:tfirst
跳到前count個
:[count]tprevious
跳到后count個
:[count]tnext
跳到最后一個
:tlast
你也可以在所有tagname中選擇:
:tselect tagname
如果想跳到包含block的標識符:“tag /block” 然后用TAB鍵來選擇。這里'/'就是告訴vim
'block'是一個語句塊標簽。
2)用“CTRL + ]“快捷鍵,跳轉到光標所在函數標識符的定義處。
3)使用“CTRL + T”退回上層。如果想在以write_開頭的標識符中選擇一下, :tselect /^
write_ 這里,'^'表示開頭,同理,'$'表示末尾。多個同名的標識符
Cscope
運行cscope命令,出現兩個面板,上方是一個查找結果的顯示面板,下方是一個查找條件
指定面板。使用TAB鍵在兩個面板間切換,也可使用上下左右方向件和翻頁鍵在同一面板內
貼換位置。選中顯示面板的某個項,回車即可進入該文件,這是調用vim打開文件,這時就
可以結合ctags使用了。當然也可以直接使用vim打開文件,結合ctags閱讀源碼。
使用前,必須現使用“cscope-indexer -r”命令遞歸生成索引信息文件。特殊情況下,還需
要用戶使用find命令,主動生成索引信息文件,并指定給cscope工具。 cscope提供了如下
九種查詢方式:
Find this C symbol:
#查找指定的C符號
Find this global definition:
#查找指定的全局定義
Find functions called by this function:
#查找指定函數調用的函數
Find functions calling this function:
#查找調用指定函數的函數
Find this text string:
#查找字符串
Change this text string:
#修改指定字符串
Find this egrep pattern:
#查找匹配字符
Find this file:
#查找指定文件
Find files #including this file:
#指定引用頭文件進行查找
在對應某一項中輸入查找條件,回車即可進行查詢,并將結果顯示在顯示面板。
應用實例
下面以使用cscope閱讀內核源代碼為例:
$ wget
http://kernel.org/pub/linux/kernel/v2.6/linux-2.6.27.6.tar.bz2
#從Linux內核官網下載內核源代碼
$ tar xvfj linux-2.6.27.6.tar.bz2
#解壓文件
$ cd linux-2.6.27.6
#進入源代碼根目錄
$ ctags -R
#遞歸生成標簽文件
$ cscope-indexer -r
#遞歸生成索引信息文件
$ cscope
#使用cscope閱讀源碼
標簽文件、索引信息文件只需要第一次或者代碼發生變動時生成,以后使用直接運行
cscope即可。
[1]
http://sourcenav.sourceforge.net/ [2]
http://www.sourceinsight.com/ [3]
http://lxr.linux.no/ [4]
http://cscope.sourceforge.net/ [5]
http://vcd.gro.clinux.org/