???? 吃燒餅不免會掉芝麻,寫程序不免會有
bug
。再怎么高明的程序員,也不敢保證寫出來的程序不會有
bug
。當發現程序有誤,
bug
隱身其中時,就是
debugger
出動的時候了。越是高明的程序員,越是能夠靈巧地使用
debugger
,讓
bug
無所遁形。
?????? Debug
的過程分成兩個步驟:
l????????
找到
bug
所在地
l????????
修正
bug
????? 事實上,真正困難的地方在第一點,如果你能找到
bug
所在地,應該就知道怎么修正
bug
了。本文章簡單地介紹
debugger
的用法,希望你再次遇到
bug
時,能夠不慌不忙地把這些技巧派上用場。
調整步伐
????? 最不花腦筋的
debug
方式就是:逐行執行,每執行一行程序代碼就暫停,立刻觀察這一行的執行結果是否如你所預期,沒問題的話就繼續執行下一行。
????? 當你在逐行執行的時候,如果遇到了
method invocation
(方法調用),你可以選擇要跳進此
method
或者不跳進此
method
。欲跳進此
method
,就使用
step in
;欲一口氣執行完此
method
,就使用
step over
。至于要不要跳進去,你可以有自己的考量。一般來說,如果你認定該
method
應該不會有問題時,你就使用
step over
,否則使用
step in
。
????? 如果已經在某
method
內,但是認為此
method
后面的程序代碼不會有
bug
,你可以透過
step out
來往上跳,跳離開這個
method
。
????? 在
debug
的時候,前進的步伐很重要,
step over
、
step in
、
step out
三者必須好好搭配使用,才不會“自亂陣腳”。
控制疏密
????? 光靠上面三種
step
方式,要找到
bug
,就如同海底撈針一樣,并不容易。你還需要
breakpoint
(斷點)的輔助。
????? 你應該先透過經驗來判斷,
bug
最有可能出現在哪些地方。然后在這些地方的前后分別設定
breakpoint
。為了加快
debug
的速度,我們經常同時在程序中設定多個斷點。
????? 在
debug
模式下執行程序時,遇到斷點,程序就會暫停,我們可以利用這個機會檢視目前的執行結果是否符合預期,如果有差池的話,就表示剛才執行過的程序代碼有問題,你已經找到了
bug
的區域,立刻停止此次的
debug
執行模式。接著再重來一次,繼續縮小范圍。當范圍已經很小時,可以改用
step
的方式來找
bug
。
分析觀察
????? 不管是肇因于
breakpoint
或
step
,程序在
debug
模式下暫停時,我們都需要“觀察”(
watch
)程序目前的狀態(
state
),據以判斷方才的執行過程有無錯誤。程序狀態其實就是數據的集合,所以我們的“觀察”對象就是程序中的變量值。
debug
工具可以讓我們很方便地觀察程序中各個變量的值,有些
debug
工具還可以讓我們輸入由變量組成的計算式(
expression
),輸出計算結果以方便我們觀察。
????? 某些
debugger
甚至具有修改變量值的功能,可以讓你在程序暫停時,修改程序狀態,然后繼續執行。
理清頭緒
????? 對于多線程(
multi-thread
)程序,
debugger
依然能進行上述的
step
、
breakpoint
、
watch
。通常
debugger
會在
watch
窗口中以樹狀結構區分出線程,然后才個別列出各個線程的區域變量,以免混淆。
????? 為了因應撰寫
client/server
程序的需求,有些
debug
工具甚至可以同時幫助多個
process
進行除錯。
隔空抓藥
????? “捎來藥丸的,可是白胡子的老公公?”我們姑且相信這個妖婦
的確具備隔空抓藥的本事,但提到這樣的本事,許多
debugger
也不多讓。越來越多的
debugger
開始支持
remote debugging
,讓程序員可以在一部
PC
上,
debug
另一部
PC
上的程序。
????? 以
Java
來說,最早支持
remote debugging
的是
VisualCafe
。現在,
Sun
的
JVM
都支持
JVMDI
(
Java VM Debug Interface
)以及
JDWP
(
Java Debug Wire Protocol
),所以想設計出一個能隔空抓藥的標準
remote debugger
也不難,主流的
Java
開發工具也開始支持
remote debugging
。
de
程序中的
bug
,也
de
生活中的
bug
????? 我們除了
de
程序中的
bug
,也要
de
生活中的
bug
(竊聽器也被稱做
bug
)。軍政要人的座機可能被裝滿
bug
,美鳳姊姊的座車和手機內也被裝了
bug
。越是重要的人,周遭的
bug
就會越多,越是需要常常進行
debug
。
????? 如果無法確定生活中毫無
bug
,請各位務必要做最壞的打算,試圖干擾任何可能存在的
bug
,做法很簡單,例如:放大電視機音量、關燈,都很有效。那也就是為什么,我向親近好友坦承“關燈版”的男主角其實就是我,至今仍然沒有人相信的緣故。