程序調試

程序實際運行前修正錯誤的過程

程序調試是將編製的程序投入實際運行前,用手工或編譯程序等方法進行測試,修正語法錯誤和邏輯錯誤的過程。這是保證計算機信息系統正確性的必不可少的步驟。編完計算機程序,必須送入計算機中測試。根據測試時所發現的錯誤,進一步診斷,找出原因和具體的位置進行修正。

步驟


第一步,用編輯程序把編製的源程序按照一定的書寫格式送到計算機中,編輯程序會根據使用人員的意圖對源程序進行增、刪或修改。
第二步,把送入的源程序翻譯成機器語言,即用編譯程序對源程序進行語法檢查並將符合語法規則的源程序語句翻譯成計算機能識別的“語言”。如果經編譯程序檢查,發現有語法錯誤,那就必須用編輯程序來修改源程序中的語法錯誤,然後再編譯,直至沒有語法錯誤為止。
第三步,使用計算機中的連接程序,把翻譯好的計算機語言程序連接起來,並扶植成一個計算機能真正運行的程序。在連接過程中,一般不會出現連接錯誤,如果出現了連接錯誤,說明源程序中存在子程序的調用混亂或參數傳遞錯誤等問題。這時又要用編輯程序對源程序進行修改,再進行編譯和連接,如此反覆進行,直至沒有連接錯誤為止。
第四步,將修改後的程序進行試算,這時可以假設幾個模擬數據去試運行,並把輸出結果與手工處理的正確結果相比較。如有差異,就表明計算機的程序存在有邏輯錯誤。如果程序不大,可以用人工方法去模擬計算機對源程序的這幾個數據進行修改處理;如果程序比較大,人工模擬顯然行不通,這時只能將計算機設置成單步執行的方式,一步步跟蹤程序的運行。一旦找到問題所在,仍然要用編輯程序來修改源程序,接著仍要編譯、連接和執行,直至無邏輯錯誤為止。也可以在完成後再進行編譯。

原則


一,用頭腦去分析思考與錯誤徵兆有關的信息。
二,避開死胡同。
三,只把調試工具當做手段。利用調試工具,可以幫助思考,但不能代替思考,因為調試工具給的是一種無規律的調試方法。
四,避免用試探法,最多只能把它當做最後手段。
五,在出現錯誤的地方,可能還有別的錯誤。
六,修改錯誤的一個常見失誤是只修改了這個錯誤的徵兆或這個錯誤的表現,而沒有修改錯誤本身。如果提出的修改不能解釋與這個錯誤有關的全部線索,那就表明只修改了錯誤的一部分。
七,注意修正一個錯誤的同時可能會引入新的錯誤。
八,修改錯誤的過程將迫使人們暫時回到程序設計階段。修改錯誤也是程序設計的一種形式。
九,修改源代碼程序,不要改變目標代碼。

方法


一,簡單調試方法:步驟
1,在程序中插入列印語句、優點是能夠顯示程序的動態過程,比較容易檢查源程序的有關信息。缺點是效率低,可能輸入大量無關的數據,發現錯誤帶有偶然性。
2,運行部分程序。有時為了測試某些被懷疑有錯的程序段,卻將整個程序反覆執行許多次,在這種情況下,應設法使被測程序只執行需要檢查的程序段,以提高效率。
3,藉助調試工具。目前大多數程序設計語言都有專門的調試工具,可以用這些工具來分析程序的動態行為。
二,回溯法排錯。確定最先發現錯誤癥狀的地方,人工沿程序的控制流往回追蹤源程序代碼,直到找到錯誤或範圍。
三,歸納法排錯。是一種系統化的思考方法,是從個別推斷全體的方法,這種方法從線索(錯誤徵兆出發),通過分析這些線索之間的關係找出故障。主要有4步:
(1)收集有關數據。收集測試用例,弄清測試用例觀察到哪些錯誤徵兆,以及在什麼情況下出現錯誤等信息。
(2)組織數據。整理分析數據,以便發現規律,即什麼條件下出現錯誤,什麼條件下不出現錯誤。
(3)導出假設。分析研究線索之間的關係,力求找出它們的規律,從而提出關於錯誤的一個或多個假設,如果無法做出假設,則應設計並執行更多的測試用例,以便獲得更多的數據。
(4)證明假設。假設不等於事實,證明假設的合理性是極其重要的,不經證明就根據假設排除錯誤,往往只能消除錯誤的徵兆或只能改正部分錯誤。證明假設的方法是用它解釋所有原始的測試結果,如果能圓滿地解釋一切現象,則假設得到證明,否則要麼是假設不成立或不完備,要麼是有多個錯誤同時存在。
四,演繹法排錯。設想可能的原因,用已有的數據排除不正確的假設,精化並證明餘下的假設。
五、對分查找法。如果知道每個變數子啊程序內若干個關鍵點上的正確值,則可用賦值語句或輸入語句在程序中的關鍵點附近“注入”這些變數的正確值,然後檢查程序的輸出。如果輸出結果是正確的,則表示錯誤發生在前半部分,否則,不妨認為錯誤在後半部分。這樣反覆進行多次,逐漸逼近錯誤位置。

分類


靜態調試

可以採用如下兩種方法:
(1)輸出寄存器的內容。在測試中出現問題,設法保留現場信息。把所有寄存器和主存中有關部分的內容列印出來(通常以八進位或十六進位的形式列印),進行分析研究。用這種方法調試,輸出的是程序的靜止狀態(程序在某一時刻的狀態),效率非常低,不得已時才採用。
(2)為取得關鍵變數的動態值,在程序中插入列印語句。這是取得動態信息的簡單方法,並可檢驗在某時間后某個變數是否按預期要求發生了變化。此方法的缺點是可能輸出大量需要分析的信息,必須修改源程序才能插入列印語句,這可能改變關鍵的時序關係,引入新的錯誤。

動態調試

通常利用程序語言提供的調試功能或專門的調試工具來分析程序的動態行為。一般程序語言和工具提供的調試功能有檢查主存和寄存器;設置斷點,即當執行到特定語句或改變特定變數的值時,程序停止執行,以便分析程序此時的狀態。