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

1.6.2 動態調試

在靜態調試中可以發現和改正很多錯誤,但由于靜態調試的特點,有一些比較隱蔽的錯誤還不能檢查出來。只有上機進行動態調試,才能找出這些錯誤并改正它們。

1.編譯過程中的調試

編譯過程除了將源程序翻譯成目標程序外,還要對源程序進行語法檢查。如果發現源程序有語法錯誤,系統將顯示錯誤信息。用戶可以根據這些提示信息查找出錯誤性質,并在程序中出錯之處進行相應的修改。有時我們會發現編譯時有幾行的錯誤信息都是一樣的,但檢查這些行本身又沒有發現錯誤,此時要仔細檢查與這些行有關的名字、表達式是否有問題。例如,因為程序中數組說明語句有錯,這時,那些與該數組有關的程序行都會被編譯系統檢查出錯。這種情況下,用戶只要仔細分析一下,修改數組說明語句的錯誤后,許多錯誤也就會同時消失。對于編譯階段的調試,要充分利用屏幕給出的錯誤信息,對它進行仔細分析判斷。只要注意總結經驗,使程序通過編譯是不難做到的。

例如,圖1-7所示為對某個程序編譯調試的結果圖,從圖中可知,第4行的變量i、第6行的變量sum沒有定義,第8行丟掉了分號“;”。

圖1-7 編譯錯誤

排除編譯錯誤時需注意兩點:

(1)每次排除編譯錯誤時最好從第一個錯誤開始排除,因為其他的錯誤有可能是因為第一個錯誤級聯產生的。排除第一個錯誤之后重新編譯,如果仍然有錯,再從第一個錯誤開始排除。

(2)編譯系統給出的某些錯誤提示信息,有時和實際出錯原因并不相符,但提示的錯誤位置不會出錯。因此要多多積累調試經驗,提高調試技能。

2.連接過程中的調試

編譯通過后要進行連接,連接的過程也有查錯的功能,它將指出外部調用、函數之間的聯系及存儲區設置等方面的錯誤。如果連接時有這類錯誤,編譯系統也會給出錯誤信息,用戶要對這些信息仔細判斷,從而找出程序中的問題并糾正之。連接時較常見的錯誤有以下幾類:

(1)某個外部調用有錯,通常系統明確提示了外部調用的名字,只要仔細檢查各模塊中與該名有關的語句,就不難發現錯誤。

(2)找不到某個庫函數或某個文件,這類錯誤是由于庫函數名寫錯,疏忽了某個庫文件連接等。

(3)某些模塊的參數超過了系統的限制。如模塊的大小、庫文件的個數超出要求等。

引起連接錯誤的原因很多,而且很隱蔽,給出的錯誤信息也不如編譯時給出的直接、具體。因此,連接時的錯誤要比編譯錯誤更難查找,需要仔細判斷,而且對系統的限制和要求要有所了解。

3.運行過程中的調試

運行過程中的調試是動態調試的最后一個階段。這一階段的錯誤可分為兩類:

(1)運行程序給出出錯信息

運行時出錯多與數據的輸入、輸出格式有關,與文件的操作有關,與程序運行時使用了沒有分配給該程序的內存空間有關。

例如:

①利用scanf()函數輸入數據,如scanf("%d",a);。假設此時a中的值為1000,則程序執行時會把輸入的數據放到地址為1000的內存單元中,而不是放到變量a所占的內存單元中,從而造成運行錯誤。

②在使用數組元素a[i]時,變量i沒有賦初值,或i的值已經超過數組a的下標范圍。這時程序仍會按照公式“a+i×sizeof(a的數據類型)”計算需訪問內存單元的地址,從而造成運行錯誤。

③指針變量p沒有賦初值而直接使用*p。指針變量沒有賦初值,則其值是一個隨機數,而使用*p時則是訪問以這個隨機數為地址的內存單元,從而造成運行錯誤。

(2)運行結果不正常或不正確

出現這類錯誤比較難查出錯原因,需要對整個程序進行全面檢查。

主站蜘蛛池模板: 元阳县| 蕉岭县| 普兰县| 蓬溪县| 北海市| 桑植县| 延吉市| 赣榆县| 新丰县| 嘉荫县| 南丹县| 双柏县| 轮台县| 阳曲县| 广昌县| 凤山市| 莆田市| 元朗区| 福建省| 安陆市| 呼玛县| 寿光市| 卫辉市| 上虞市| 眉山市| 陇西县| 措勤县| 原阳县| 沭阳县| 抚顺市| 丹江口市| 长寿区| 九龙县| 丹巴县| 林甸县| 九龙坡区| 宁化县| 香港| 克山县| 深泽县| 白玉县|