官术网_书友最值得收藏!

1.6.4 程序調試

無論使用何種編程語言和編程工具,調試(Debug)的基本原理和步驟都是一樣的。

(1)首先,通過人工檢查的方式粗略判斷出錯誤所在的范圍,若無法判斷,則認為被執行的第一行代碼可能有錯誤。

(2)然后在范圍的起始處設置斷點,并以調試方式執行程序。當程序執行到斷點處時,會暫時停止執行。

(3)接著,查看相關的變量或感興趣的表達式在這一刻的實際值與預期值(即人腦計算出來的值,假設該值總是正確的)是否一致。若一致,則讓程序從該斷點處繼續執行下一行代碼。重復這一過程直至發現不一致,此時,被執行完的最后一行代碼就是錯誤所在的位置。

注意:在對比實際值與預期值的過程中,還要對比程序的實際執行流程是否與預期流程一致,這對于定位分支、循環等結構中錯誤代碼所在的位置尤為有用。

編程工具一般會提供諸如設置斷點、查看變量或表達式,以及讓程序從斷點處執行下一行或下若干行代碼的功能。JDK也提供了用于調試程序的工具——jdb.exe,但該工具是基于命令行的,在實際使用中非常不方便,對于較為復雜的程序,通常借助IDE來調試(詳見附錄A)。

人工檢查與調試這兩種判斷邏輯錯誤所在位置的方式,讀者都應當熟練掌握,當程序邏輯較為復雜時,應優先考慮使用調試方式。當然,調試方式也有著自身的局限性,對于某些特定的程序,有時很難用調試的方式來定位邏輯錯誤,如多線程程序[3]。對于這樣的程序,可以采用一些輔助的技巧來幫助尋找邏輯錯誤。例如,在程序的合適位置添加輸出語句,將變量或表達式的值輸出到命令行窗口,以觀察程序的運行細節、注釋或取消注釋某些代碼行并結合排除法判斷錯誤所在行等。

總而言之,在定位程序的邏輯錯誤時,沒有一種方法能適用于所有場合。編程時,應學會并盡量遵守某些已被證明是行之有效的編碼規范和最佳實踐(詳見附錄C),以最大限度地減少邏輯錯誤的出現機會。當錯誤不可避免地發生時,應當根據錯誤所表現的具體特征以及實際情況,靈活運用多種方式來分析和定位邏輯錯誤。


[1]對于不存在編譯過程的解釋型語言,運行具有語法錯誤的程序時,運行環境將直接拋出錯誤。

[2]要求比較嚴格的軟件項目可能會規定代碼必須符合“零警告”。

[3]若在多線程程序的代碼中設置斷點,程序會因該斷點而暫停執行其他線程。另外,由于CPU對多個線程的準確調度時機是無法預期的,斷點的設置將影響實際的線程執行順序。換句話說,對于完全相同的代碼和數據,程序的運行邏輯和結果與用戶選擇讓程序從斷點處繼續向后執行的時機有關,這使得對程序的調試具有了不確定性。

主站蜘蛛池模板: 阿合奇县| 抚远县| 东乡族自治县| 五原县| 韩城市| 礼泉县| 洞口县| 蒲城县| 滕州市| 临泉县| 洮南市| 菏泽市| 静海县| 安平县| 甘南县| 绥江县| 黄冈市| 东光县| 海丰县| 江阴市| 玉屏| 固始县| 黑水县| 南康市| 德江县| 舒城县| 甘肃省| 福建省| 河北省| 垦利县| 宜君县| 文成县| 奉新县| 宁化县| 高安市| 夏河县| 疏附县| 随州市| 罗田县| 嘉兴市| 巨鹿县|