google code-beautifer

星期日, 10月 21, 2007

用Emacs 開發C 程式

Version 1.1

(Oct 21: 1.0版)
(Nov.12 1.1版: xcscope 的深入討論獨立出來自成一節)

最近被學校猛操 C 程式開發,我覺得開發C 除錯的時間要比lisp長很多,非得找方便的開發除錯環境來幫忙不可。理論上我可以用eclispe或anjuta 這種大傢伙來開發,但我一邊開發除錯還要一邊作別的事,那些不是很方便。最好的選擇還是找能跟emacs 搭配的工具。

目前在emacs上裝了
ecb
xcscope
xrefactory (xref-1.6.10)
覺得工作起來順手多了。這三個各司其職:
ecb 比較接近快速的瀏覽 source code 整體本身
靜態的呼叫範圍相關問題用xcscope查
跟編譯比較接近的相關問題用xref
三者都跟emacs 的source buffer 緊密結合

除了這三者外,還有一些其他的工具,其中cbrowser好像很久沒更新。SimpleCallTree 我弄不出來,作者勸我用比較正式的工具代替。

Code Crusader 5.2.1 是商業程式。demo有兩種,一種是限制使用時間,另一種是限制最多開啟5 個檔案跟5 個視窗但還要註冊。我不是很喜歡。

Doxymacs等於是Doxygen + {X}Emacs。我根本沒時間好好弄文件,就先擱著。

還有一些不熟的地方,等日後弄通了再整理出來。參見CategoryProgrammerUtils

ecb


結合gdb, outline-mode...這些說起來話長,先放一張圖片供參考。下面會再提到。可以看到在History 視窗裡某些檔案icon 從綠點變成橘點,表示下面這些檔更動過
hmm.cpp
Point.h
其他沒有綠點/橘點的檔案(如chineseNL.txtP),是其他正在編輯但不相干這個工作目錄的。但在目錄視窗裡可以看到Makefile 被動過,所以在這會從綠點變成橘點,但不是emacs 弄的,所以不出現在History 視窗。


xcscope


跟著cscope 有個 xcscope ,提供cscope 支援,可以讓搜尋變數的過程更簡便。附圖可以看到xcscope 把搜尋viterbi 這個符號的兩個結果同時在%cscope%裡顯示

關於xcsope 的深入討論獨立出來,參見第三部分:xcscope整合。

XreFactory


XreFactory(下面簡稱xref)是 www.xref-tech.com 的產品。其中 c/java 是免費使用。現在是1.6.10版。
C/C++ 版現在是2.0.13版,只有八天合法試用期,過了就該買license。
參見http://www.emacswiki.org/cgi-bin/emacs-en/XreFactory

xrefactory 可以列出沒有用到的變數。當編譯時出現問題時,假如選擇查看 log 檔,*xref-log* 視窗會列出有問題的行。如同 cscope,這時用鼠標移到其中想要跳過去查看的那一行,按滑鼠中鍵或左鍵,主程式視窗列表就會跳到對應的那一行。

XreFactory會在~/下產生 .xrefrc

每次建立一個新project 時會產生一個以
[子目錄]
開頭的區塊,裡面可以設定 編譯的選項。我自己是把 make debug 放進去,在
Makefile 註明 gcc -g 好產生符號表供dgb使用。

三者整合使用


這兩者分別控制獨立相對應的主程式列表視窗。

假如螢幕夠大,建議開兩個frame ,其中一個執行 ecb ,一個不要執行 ecb。因為 xref切frame成左右兩個視窗,建議在沒有執行 ecb的frame執行xref 動作。在有執行 ecb的frame 下切到*cscope* 的 buffer執行cscope 動作

寫好直接在 emacs主選單下選 compile。
編完直接在 emacs主選單下選 tool -> debugger(GDB)

以我手上這個程式為例,跑到最後出現
Program received signal SIGSEGV, Segmentation fault.
0x00002b4736238eab in fclose () from /lib64/libc.so.6
(gdb) where
#0 0x00002b4736238eab in fclose () from /lib64/libc.so.6
#1 0x00000000004016d6 in main (argc=1, argv=0x7fff74d3e1a8) at test.c:488
(gdb)
所以就知道程式死在第488行附近