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 阅读(187) 评论(0)  编辑  收藏 所属分类: 蔡学镛


只有注册用户登录后才能发表评论。


网站导航: