Delphi提供了一個功能強大的內置調試器(Integrated Debugger), 因而對程序的調試不用離開集成開發環境(IDE)就可以進行。
程序錯誤基本可以分為兩類,即運行時間錯和邏輯錯。所謂運行時間錯是指程序能正常編譯但在運行時出錯。邏輯錯是指程序設計和實現上的錯誤。程序語句是合法的,並順利執行了,但執行結果卻不是所希望的。
對於這兩類錯誤,調試器都可以幫助你快速定位錯誤,並通過對程序運行的跟蹤和對變量值的監視幫助你尋找錯誤的真正原因和解決錯誤的途徑。
程序調試的主要內容可以概括為如下的幾方面:
1.調試的准備和開始;
2.控制程序的執行;
3.斷點的使用;
4.檢查數據的值。
程序調試只有用戶實際上機操作才能真正掌握。在這一節中我們主要對調試中的主要問題和一些關鍵點進行介紹。至於一些很細小的問題相信讀者可以在上機實際應用中掌握,因而沒有列出。
12.4.1 調試的准備和開始
在程序開發過程中程序編碼和調試是一個持續的循環過程,只有在你對程序進行了徹底的測試後才能交付最終用戶使用。為了保證調試的徹底性,在調試前應制定一個詳細的調試計劃。一般說來應該把程序劃分為幾個相對獨立的部分,分別進行調試,以利於錯誤的迅速定位,確保每一部分程序都按設計的要求運行。
調試計劃准備好後就可以開始程序的調試。
開始一個調試過程包括:
1.編譯時產生調試信息;
2.從Delphi裡運行你的程序。
在程序調試過程中,程序的執行完全在你的控制之中。你可以在任何位置暫停程序的執行去檢查變量和數據結構的值,去顯示函數調用序列,去修改程序中變量的值以便觀察不同值對程序行為的影響。
12.4.1.1 產生調試信息
要使用內部調試器必須選中Option| Environment菜單References頁的Integrated Debugging檢查框。缺省情況下該框被選中。
在開始調試前需要使用Symbols Debug Information(調試符號信息)編譯工程文件。調試符號信息包含了一個符號表,能夠使調試器在程序的源代碼與編譯器產生的機器代碼間建立聯系。這樣在程序執行中可以同時查看對應的源代碼。
Delphi 在缺省情況下自動產生調試符號信息。在集成開發環境中的開關選項是Option|project菜單Compiler Options頁的Debug Information and Local Symbols檢查框。
當產生的調試符號信息供內部調試器使用時,編譯器把調試符號表儲存在每個相應的.dcu文件中。
如果希望在集成環境外使用Turbo Debugger,則需要把調試信息儲存在最終的 .exe文件中。為此需要選定Option|Project菜單Linker頁的Include TDW Debug Info檢查框。
由於儲存調試信息大大增加了執行文件的大小,因而調試完成後應重新生成一個不包含調試信息的執行文件。
12.4.1.2 運行程序
通過調試器(包括內置調試器)運行程序,當程序處於等待狀態時,調試器可以獲得控制,利用調試器的功能來檢查當前程序的狀態。通過合理布置屏幕顯示,使應用程序運行窗口和Code Editor(代碼編輯器)互不重疊,可以讓用戶在它們間方便地切換以觀察代碼執行的效果。
如果希望使用命令行參數來調試程序,則可以通過Run|Parameters 菜單打開運行參數對話框進行設置。
12.4.2 程序運行的控制
程序運行控制的方法和使用如下表。
表12.7 程序運行控制的方法和使用途徑
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
方法 使用途徑
───────────────────────────────
運行到光標位置 ● Code Editor加速菜單的Run to Cursor項
(Run to Cursor) ● Run主菜單的Run to Cursor項
● F4
跟蹤(Trace Into) ● Run主菜單的Trace Into項
● Trace Into加速按鈕
● F7
步進(Step Over) ● Run主菜單的Step Over項
● Step Over加速按鈕
● F8
運行到斷點 設置斷點並按正常方式運行
暫停程序執行 Run主菜單的Program Pause項
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
跟蹤和步進都是一種單步執行方式。但“步”的含義不同。對跟蹤而言它一次執行一條簡單程序語句。當碰到包含調試信息的函數或過程調用時則跳入該函數或過程,並執行其第一條可執行語句。對步進而言它一次執行一條當前模塊的可執行語句,而不管該語句是否是函數或過程調用。
運行到光標位置和運行到斷點都是程序正常運行到某一確定的源代碼位置,而後進入調試狀態。但相對於運行到光標位置而言,運行到斷點更為靈活。因為斷點一次可設置多個,同時也可以對斷點設置一定的條件。只有滿足該條件程序運行才會中止。