- C語言程序設計
- 徐鳳生 黃超 謝玉華編著
- 1361字
- 2019-10-12 15:48:44
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)運行結果不正常或不正確
出現這類錯誤比較難查出錯原因,需要對整個程序進行全面檢查。
- Reporting with Visual Studio and Crystal Reports
- 單片機C語言程序設計實訓100例:基于STC8051+Proteus仿真與實戰
- Full-Stack React Projects
- Windows Forensics Cookbook
- JavaScript程序設計(第2版)
- 移動增值應用開發技術導論
- WildFly Cookbook
- Photoshop智能手機APP界面設計
- Three.js Essentials
- 嵌入式Linux與物聯網軟件開發:C語言內核深度解析
- 小學生Python創意編程(視頻教學版)
- Python機器學習
- WebGIS之Leaflet全面解析
- 移山之道:VSTS軟件開發指南
- C語言入門很輕松(微課超值版)