2009/01/13

使用 vim 和 cscope 來 trace 程式碼

Vim 是個很實用的程式編寫工具,不過一開始需要花點心力走過學習曲線。有興趣的人可以在網路上找找學習教材;如果你已經有點基礎但記不清按鍵,以下這個網址提供相當有系統的整理,依照功能分成七個自學課程,很值得一看:
除了編寫程式,Vim 用來追溯程式 (trace code) 也相當好用。例如,先將游標移到程式的某個文字串,再按以下按鍵:
  • '*' 往前找出此文字串 (按 n、N 繼續找)
  • '#' 往後找出此文字串 (按 n、N 繼續找)
  • 'gd' 將此文字串視為 local 變數,找到定義此 local 變數的地方 (如果有的話)
其他追溯程式常見的動作:
  • '%' 找到被配的括號
  • '[[' 找到函數的開頭
  • ']]' 找到下一個函數的開頭
當你維護的軟體專案不小時,上述功能絕對不夠用。這時你需要 cscope 的協助。當你安裝好 cscope,而且建立好專案的 cscope 資料庫之後,將游標移到程式當中某個文字串,按 Ctrl+\ 再按以下按鍵:
  • 's': 即 Symbol,以此文字串當識別字,列出專案當中所有參考到此識別字的地方,包含定義和引用
  • 'g': 即 Global,以此文字串當作 global 變數或函數的名稱,跳到專案中定義此 global 變數或函數的地方 (這個功能有另一個與 ctags 相同的快速鍵 Ctrl-])
  • 'c': 即 Calls,以此文字串當函數名稱,找出所有呼叫到的此函數的函數
  • 't': 即 Text,列出專案中所有出現此文字串的地方 (包含註解)
  • 'e': 即 Egrep,以此文字串當 regular expression,用 egrep 方式來搜尋
  • 'f': 即 File,以此文字串當檔案名稱,開啟此檔案
  • 'i': 即 Includes,以此文字串當 header 檔名稱,列出所有 include 此檔案的檔案
  • 'd': 即 calleD,以此文字串當函數名稱,列出此函數所呼叫到的函數
上述指令若是列出相關程式碼,你可以輸入數字加 Enter 來跳到該檔案的相對位置。按 Ctrl-T 就會回到游標原來的檔案和位置。你也可以用以下的方式來輸入指令 (foo 就是搜尋的文字串):
  • :cscope find symbol foo
  • :cs f s foo
安裝 cscope 的方法:
sudo apt-get install cscope
mkdir -p ~/.vim/plugin
cd ~/.vim/plugin
wget http://cscope.sourceforge.net/cscope_maps.vim
建立及更新軟體專案 cscope 資料庫的簡單方法如下 (其他更複雜的用法請參考 http://cscope.sourceforge.net):
cd PROJECT
cscope -bR

沒有留言: