吃烧饼不免会掉芝麻,写程序不免会有
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
,做法很简单,例如:放大电视机音量、关灯,都很有效。那也就是为什么,我向亲近好友坦承“关灯版”的男主角其实就是我,至今仍然没有人相信的缘故。