程序调试
沒有人會在寫程序的時候不出錯誤。如果只是語法錯誤,那么VFP在編譯程序時就會指出,但VFP的編譯器對邏輯錯誤就無能為力了。邏輯錯誤不同于語法錯誤,程序可能是一系列語法正確的指令,但結果卻是錯誤的。在長而復雜的程序中,邏輯錯誤可能會非常隱蔽和模糊。某些典型的情況包括:程序對一個沒有預見到的變量的值錯誤地進行了處理,或計算的順序錯了,選擇了錯誤的工作區或主索引,在使用了一系列的不同的表之后沒有恢復先前的環境等等。
????? 當程序運行時產生了錯誤或得到了不正確的結果,往往需要跟蹤程序的運行才能找出錯誤所在,為此VFP提供了豐富的調試工具,幫助我們逐步發現代碼中的錯誤,有效地解決問題。選擇“工具/調試器”菜單項中,就打開了“調試器”窗口。也可以使用下面的任意命令打開調試器:
DEBUG
SET STEP ON
SET ECHO ON
下面就介紹調試工具的使用方法。
一.跟蹤窗口
??? 在調試中,可以使用的一個最有用的方法就是跟蹤代碼,以此觀察每一行代碼的運行,同時檢查所有的變量、屬性和環境設置的值。
??? 用“窗口/跟蹤”菜單項或工具欄中的跟蹤按鈕可以打開“跟蹤”窗口。選擇“調試/運行”菜單項,在打開的“運行”對話框中,選擇要跟蹤的程序或表單,在“跟蹤”窗口打開它。如圖1。在追蹤代碼時,工具欄提供了四種運行程序的方法:
l???????? <v:shape id="_x0000_s1052" <v:shape 每次執行程序的一個代碼行,執行后程序暫停。如果被跟蹤的程序調用了一個函數或過程,則跟蹤進入調用過程或函數的內部。
l???????? 每次執行程序的一個代碼行,執行后程序暫停,但不跟蹤被調用的過程或函數。
l???????? <v:shape id="_x0000_s1054" <v:shape 執行完當前過程或函數中的其余代碼,然后回到調用程序。
l???????? 運行當前程序到包含光標的行
當決定停止追蹤代碼,但又想把它執行完時,可以單擊“繼續執行”按鈕,告訴VFP繼續執行程序直到它遇到一個斷點或程序的末尾。在檢查了一個疑點區后可以單擊這個按鈕正常地結束程序。也可以通過單擊“取消”按鈕來終止程序。
斷點允許將執行程序停止,設置斷點可縮小逐步調試代碼的范圍。若要為某個特定的代碼行設置斷點,可以雙擊該行旁邊的陰影頁邊,或者把光標放在行中并按下空格鍵或回車鍵。該代碼行左邊的灰色區域中會顯示一個實心點 ,這表明該行已經設置了一個斷點。除此之外,利用VFP的“斷點”對話框(單擊工具欄上的“斷點對話框”按鈕即可打開),還可以設置各種類型的斷點。
缺省的斷點類型是“在定位處中斷”,這意味著程序在遇到這一行時暫停執行。“定位”文本框指定了斷點的過程或函數名以及從這個過程或函數開始的行號。“文件”文本框指定了包含斷點的文件。下表是設置斷點指定位置和文件的示例:
| 位置 | 文件 | 在何處將執行程序停止 |
| ErrHandler | C:\VFP\SAMPLES | 在程序 MAIN.PRG 中,名字為 ErrHandler 的過程里的第一個可執行的行。 |
| Main,10 | C:\VFP\SAMPLES | 在名字為 Main 程序的第十行。 |
| Click | C:\Myapp\Form.scx | 在文件 FORM.SCX 中,任何一個名字為 Click 的過程、函數、方法程序或事件的第一個可執行的代碼行。 |
| cmdNext.Click | C:\Myapp\Form.scx | 文件 FORM.SCX 中,在 cmdNext 控件的 Click 事件中,第一個可執行的行。 |
| cmdNext::Click | ? | 在任意文件中,父類為 cmdNext 的任何控件的 Click 事件中,第一個可執行的行。 |
??? 這種斷點類型還可以指定追蹤開始時的運行次數。假設在循環中有一處錯誤,在前100次循環時計算是有效的,但在100 次之后就會產生錯誤。我們當然不想遇到錯誤前一步一步地循環100次,這時只要在“運行次數”文本框中填入100,則調試器在循環過100 遍之后才開始追蹤模式。
??? 第二種斷點類型“如果表達式為真則在斷點處中斷” 指定只有當滿足某一特定條件的時候,才在某特定行上將執行程序停止。“表達式”文本框將指定這一特定條件。
??? 在調試中經常會遇到這種情況:不想在某個特定的行上將程序停止,只有當滿足某特定條件時才將程序停止。這時可以選擇第三種斷點類型“表達式為真時中斷”。下表是斷點表達式的示例:
| 表達式 | 用于 |
| EOF( ) | 當表中的記錄指針移過最后一條記錄時,將程序停止。 |
| 'CLICK'$PROGRAM( ) | 在與 Click 或者 DblClick 事件相關的第一行代碼上,將程序停止。 |
| nReturnValue = 6 | 如果一個信息框的返回值存儲在 nReturnValue 中,當用戶在該信息框上選擇“確定”的時候,將程序停止。 |
??? 如果要了解何時一個變量或者屬性的值發生了變化,或者想知道何時運行條件改變了,那么可以選擇第四種斷點類型“當表達式值改變時停止”,對一個表達式設置斷點。示例見下表:
| 表達式? | 用于 |
| RECNO( ) | 當表中的記錄指針移動時,將程序停止。 |
| PROGRAM( ) | 在任意一個新的程序、過程、方法程序或事件的第一行上,將程序停止。 |
| myform.Text1.Value | 當該屬性的值由于用戶交互或程序運行而發生了改變時,將程序停止。 |
?
二.局部窗口和監視窗口
??? 使用調試器的一個好處是:在程序暫停運行時能夠很容易看到變量、數組元素、屬性和表達式的運行值,從而確定代碼是否正確。在“跟蹤”窗口中,將光標定位到任何一個變量、數組或屬性上,就可以在提示條中顯示它的當前值。除此之外,調試器還為我們提供了兩個窗口來完成這一功能。
??? “局部”窗口會顯示調用堆棧上任意程序、過程或方法程序里面所有的變量、數組、對象和對象元素。默認情況下,在“局部”窗口中所顯示的是當前執行程序中的值。通過在“局部變量的位置”列表中選擇程序或過程,也可以查看其他程序或過程的值。
??? 有時我們并不想查看所有的變量,而只是想看看一兩個變量來確定它們為什么沒有獲得期望的值。在這種情況下,使用監視窗口更合情理。在“監視”窗口的“監視”框中,鍵入任意一個有效的 VFP 表達式,然后回車。這時,該表達式的值和類型就會出現在“監視”窗口的列表中。也可以在“跟蹤”窗口或其他的“調試程序”窗口中,選擇變量或者表達式,然后將它們拖至“監視”窗口中。在“監視”窗口中,那些已經改變的值會顯示為紅色。在“監視”窗口中,雙擊一個監視項,還可以對其進行編輯。
??? 局部窗口能查看任何例程及在那里定義了什么變量,而監視窗口只能查看當前過程或函數中的變量。在“局部”窗口和“監視”窗口中,單擊數組或對象名稱旁邊的加號(+),可以查看數組或對象的下一級內容。當進入下一級時,就能夠看到數組中所有的數組元素值,以及對象的所有屬性設置。
在“局部”窗口和“監視”窗口中,通過選擇所需的變量、數組元素或屬性,然后單擊“值”列,同時鍵入一個新值,即可改變這些變量、數組元素或屬性的值。
?
三.事件跟蹤
??? 有時候知道不同對象的事件被觸發的順序是很有幫助的。面向對象編程的真正秘密在于知道在每個事件的方法中放置什么代碼,使它們以正確的順序執行。有時當程序不能正常工作時,確定方法中代碼是否正確的最簡單方法是打開事件跟蹤。在調試器中選定“工具/事件跟蹤”菜單項,即可打開“事件跟蹤”對話框。
? ??在這里可以選擇需要跟蹤的事件。缺省時,所有的事件都是預選定的。由于 MouseMove 和 Paint 事件發生次數頻繁,很難看到其他的事件序列,所以建議把這兩個事件從“跟蹤事件”列表中移去。
??? 選中“開啟事件跟蹤”復選框即可激活事件跟蹤,此后每當“跟蹤事件”列表中的一個系統事件發生時,該事件名字就會顯示在“調試輸出”窗口中(單擊工具欄中的“輸出窗口”按鈕即可打開),或者寫到一個文件里。
?
四.使用錯誤處理程序
即使進行了大量的測試和調試,也不能保證程序不出錯。比如在處理一個數據表時,發生了停電,就會毀壞這個表。那么以后當程序中用到這個表時,就會出現錯誤。當過程中的代碼發生錯誤時,VFP 將檢查與 ON ERROR 例程相關的錯誤處理代碼。如果 ON ERROR 例程不存在,VFP 就顯示默認的錯誤信息。在 ON ERROR 后面,可以包含任意有效的 VFP 命令或者表達式,但一般情況是調用一個錯誤處理過程或程序。
??? 在“命令”窗口中鍵入一個不認識的命令,如:AAA
這時會出現一個標準的 VFP 錯誤信息對話框,顯示“不能識別的命令謂詞”。但是如果執行下面的代碼,活動的輸出窗口中就會顯示錯誤號 16,而不在對話框中顯示標準的錯誤信息。
ON ERROR ?ERROR()?? &&ERROR()返回一個代表了錯誤的數字
AAA
執行不帶任何參數的 ON ERROR,會重新將錯誤信息設置為 VFP 內部指定的內容。
下面的代碼描述了一個簡單的 ON ERROR 錯誤處理程序:
lcOldOnError = ON("ERROR")? &&保存原始的錯誤處理程序
ON ERROR DO errhandler WITH ERROR() &&執行帶有過程名的 ON ERROR
*錯誤處理例程所應用的代碼部分
ON ERROR &lcOldOnError? &&重新設置原始的錯誤處理程序
?
PROCEDURE errhandler
LPARAMETER lnErrorNo
DO CASE
??? CASE lnErrorNo = 1 &&文件不存在
??????? *顯示合適的信息
??????? *采取一些手段修正錯誤
??? OTHERWISE
??????? *顯示一個通用的信息
ENDPROC
?
本講介紹了VFP的調試工具,以及使用錯誤處理程序的方法。對于初級的編程人員來說,要熟悉調試應用程序只有通過不斷地學習和上機操作來積累經驗,即使對于編程高手,花在調試應用程序方面的時間仍然是可觀的。不過,所有的努力將因為減少了維護應用程序的工作量而得到回報。
總結
- 上一篇: gdb调试之堆栈跟踪
- 下一篇: 在VS中调试C#程序,如何查看内存、寄存