尋找及修復錯誤,或稱為”除錯”(debugging),已經是軟體開發過程必經的階 段。電腦先驅 Maurice Wilkes[11]在 1940 年代曾描述說,他餘生的大部分時間,
將花在尋找他所寫程式中的錯誤。當軟體日趨龐大且複雜的同時,除錯也變的越 來越困難。因此,出現了 debugger 這樣的系統程式,用來幫助程式設計者逐步 執行程式碼,藉由觀察程式狀態及變數值的變化來尋找程式中的錯誤。少了
debugger,程式設計者就只能透過新增列印指令的方式,在有可能出錯的程式片 段將變數的值輸出至螢幕或是檔案裡,然後進行除錯,非常的沒有效率。
debugger 的製作相當困難,因為必須透過作業系統以及硬體架構的支援,
而且和程式語言也具有相依性。圖 4 是一個典型的 debugger 架構。程式語言的 種類相當多,通常都有各自相對映的 debugger,甚至有的 debugger 也支援不只 一種程式語言。
圖 4 debugger 的架構圖
常見的除錯器包含 GDB 以及 JDB。GDB[12]是由 Richard Stallman 在 1968 針對 GNU 系統所寫的一個 debugger。因為 GDB 具有可攜性,所以後來在許多 Unix-like 系統上也可以使用,而且它支援程式語言相當多,例如:Ada、C、C++、
Fortran…等。GDB 是一個命令列模式(command line interface)的 debugger,也就 是一切除錯的過程,都要透過下指令的方式來與 debugger 做互動。例如:list 指 令可以列印程式本文,print 指令可以印出運算式的值,break 加上列號或函數名 稱可以設定中斷點。對於已經習慣命令列模式的資深程式設計師,使用這樣的工 具當然沒有太大問題,不過對於新進的菜鳥程式設計師,可能就還要花費一段時 間去學習各個指令的功能,沒有辦法很快上手。
為了讓使用上更為便利,圖形使用者界面 (graphical user interface)開始被導 入 debugger 中,也就是 debugger front-end。使用者透過 debugger front-end 的
GUI(graphical user interface)與後端的 debugger 溝通,而不用下任何的指令。GDB 因為可使用在許多不同的 unix 系統上,所以針對不同的作業系統,也各自有對 映的 debugger front-end 可供使用。例如:KDbg 是使用在 KDE 的作業環境上,
Nemiver 是使用在 GNOME 的作業環境上,而 Xxgdb 則是使用在 X-window 環 境上。圖 5 是 KDbg 的執行視窗。不過最廣泛使用的 debugger front-end,還是 DDD[9]。
DDD 是一個 open-source
行視窗,Data Window 就是資料圖形化的視窗
gnuplot,DDD 也能將 2 維陣列以
所繪製的 1 維和 2 維陣列。不過可惜的是 視覺化也都是固定的模式,所以大部分還
圖 5 KDbg 的執行視窗
source 的 debugger front-end,可以支援多種 debugger JDB,XDB,Perl debugger 和 Python debugger
過它最出名的地方在於它可與使用者互動,然後將資料結構以圖形的方式的呈現 Python debugger 等。不 然後將資料結構以圖形的方式的呈現
等資料結構上,而無法套用在任意的資料結構中。
圖 6 DDD 的執行視窗
圖 7 DDD 透過 gnuplot 所繪製的 1 維和 2 維陣列
另一個常見的除錯器是 JDB。JDB 是由 Sun Microsystems 公司所研發的,可 支援的程式語言是 Java 。JDB 和 GDB 一樣也是命令列模式(command line interface)的 debugger,常用的指令包含 print,dump,threads,stop 等。因為使
用上的方便,一般常用的 IDE,如 JBuilder、ECLIPSE 及 WSAD(WebSphere Studio
Application Developer),都有內建 JDB 以及圖形化使用者視窗介面供使用,而不 用另外安裝 debugger front-end。