rosial

lost memory
数据加载中……

《爪哇夜未眠》- 程序设计学习篇 - Debug

     吃烧饼不免会掉芝麻,写程序不免会有 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 进行除错。

隔空抓药

      “捎来药丸的,可是白胡子的老公公?”我们姑且相信这个妖妇 [1] 的确具备隔空抓药的本事,但提到这样的本事,许多 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 ,做法很简单,例如:放大电视机音量、关灯,都很有效。那也就是为什么,我向亲近好友坦承“关灯版”的男主角其实就是我,至今仍然没有人相信的缘故。

posted on 2006-07-03 14:45 rosial 阅读(254) 评论(0)  编辑  收藏 所属分类: 蔡学镛