二次開發之程式調試_第1頁
二次開發之程式調試_第2頁
二次開發之程式調試_第3頁
二次開發之程式調試_第4頁
二次開發之程式調試_第5頁
已閱讀5頁,還剩67頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第第6章章 調試程序調試程序 6.1 6.1 概述概述 語法正確的程序并不能保證正常運行,在運行時可能會產生錯誤的結果語法正確的程序并不能保證正常運行,在運行時可能會產生錯誤的結果或者發生崩潰現象,這就需要調試。或者發生崩潰現象,這就需要調試。調試程序的步驟是:調試程序的步驟是: 控制程序在指定的位置暫停;控制程序在指定的位置暫停; 查看、分析有關變量的值;查看、分析有關變量的值; 修改程序的源代碼;修改程序的源代碼; 繼續或重新運行程序;繼續或重新運行程序; 如果程序不能正常運行,繼續調試程序,直至程序正常運行。如果程序不能正常運行,繼續調試程序,直至程序正常運行。 為了便于調試程序,為了便

2、于調試程序,Visual LISPVisual LISP提供了一些調試程序的工具,幫助用戶提供了一些調試程序的工具,幫助用戶迅速查找并改正程序中的錯誤。迅速查找并改正程序中的錯誤。 VisualLISPVisualLISP提供了監視窗口、檢驗窗口、符號服務對話框、中斷和繼續提供了監視窗口、檢驗窗口、符號服務對話框、中斷和繼續執行程序的模式、命令跟蹤、跟蹤堆棧、跟蹤窗口等調試程序的工具。執行程序的模式、命令跟蹤、跟蹤堆棧、跟蹤窗口等調試程序的工具。 通過圖通過圖6-16-1示示ViewView下拉菜單和下拉菜單和ViewView工具欄可以調用監視窗口、檢驗窗口等工具欄可以調用監視窗口、檢驗窗口等

3、調試工具。調試工具。檢驗窗口檢驗窗口跟蹤堆棧跟蹤堆棧出錯跟蹤出錯跟蹤符號服務符號服務監視窗口監視窗口自動匹配窗口自動匹配窗口斷點窗口斷點窗口編譯輸出窗口編譯輸出窗口VisualLISPVisualLISP控制臺控制臺瀏覽圖形數據庫瀏覽圖形數據庫選擇工具欄選擇工具欄圖圖6-1 View6-1 View下拉菜單下拉菜單打開監視窗口打開監視窗口匹配匹配符號服務符號服務堆棧跟蹤功能堆棧跟蹤功能打開檢測窗口打開檢測窗口激活控制臺窗口激活控制臺窗口確定活動窗口確定活動窗口切換到切換到AutoCAD圖形窗口圖形窗口 通過圖通過圖6-26-2所示所示DebugDebug下拉菜單和下拉菜單和DebugDebug

4、工具欄的選項可以設置程序暫停工具欄的選項可以設置程序暫停的模式和繼續程序運行的方式。的模式和繼續程序運行的方式。只執行一步表達式求值。只執行一步表達式求值。執行到下一個斷點,如無斷點,則執行一個完整的表達式求值。執行到下一個斷點,如無斷點,則執行一個完整的表達式求值。執行到下一個斷點,如無斷點,則執行一個最外層的表達式求值。執行到下一個斷點,如無斷點,則執行一個最外層的表達式求值。繼續執行程序繼續執行程序結束當前程序。返回到控制臺的上一層中斷頂層讀算寫循環。結束當前程序。返回到控制臺的上一層中斷頂層讀算寫循環。結束所有當前活動的斷點循環并返回到控制臺的頂層讀算寫循環。結束所有當前活動的斷點循環

5、并返回到控制臺的頂層讀算寫循環。添加監視添加監視回到最近一次監視窗口的環境回到最近一次監視窗口的環境設置設置/ /刪除斷點刪除斷點清除所有的斷點清除所有的斷點回到源程序上的最近一次的斷點回到源程序上的最近一次的斷點跟蹤命令跟蹤命令立即暫停立即暫停出錯斷開出錯斷開自動運行自動運行終止求值終止求值圖圖6-2 Debug6-2 Debug下拉菜單下拉菜單調試指示器按鈕顯示上一個斷點添加監視設置或取消斷點切換重置為頂層退出當前層繼續執行跳出表達式下一個表達式下一層嵌套表達式Debug工具欄工具欄 6.2 6.2 監視窗口監視窗口 監視窗口用于監視變量、函數在程序運行過程中的結果。選擇菜單監視窗口用于監

6、視變量、函數在程序運行過程中的結果。選擇菜單D DebugebugW Watch Last Evaluationatch Last Evaluation。將彈出圖。將彈出圖6-36-3所示的所示的監視監視窗口。窗口。 圖圖6-3 6-3 監視窗口監視窗口 1. 1. 監視窗口的工具欄監視窗口的工具欄 監視窗口的工具欄有四個圖像按鈕,從左至右依次是:監視窗口的工具欄有四個圖像按鈕,從左至右依次是:添加監視:將新的變量加入到監視窗口。添加監視:將新的變量加入到監視窗口。 清除變量:清除監視窗口內的所有的變量。清除變量:清除監視窗口內的所有的變量。排序:將監視窗口內的變量名按字母順序排序。排序:將監

7、視窗口內的變量名按字母順序排序。復制到跟蹤復制到跟蹤/ /日志:將監視窗口的內容復制到跟蹤窗口。日志:將監視窗口的內容復制到跟蹤窗口。如果打開了日志選項,監視窗口中的這些內容也將被復制到跟蹤日志文件。如果打開了日志選項,監視窗口中的這些內容也將被復制到跟蹤日志文件。2. 2. 監視窗口的快捷菜單監視窗口的快捷菜單 選擇監視列表中的某一項并單擊鼠標右鍵,可顯示圖選擇監視列表中的某一項并單擊鼠標右鍵,可顯示圖6-46-4所示監視窗口所示監視窗口的快捷菜單。的快捷菜單。調用檢驗功能,查看所選值。調用檢驗功能,查看所選值。將所選變量的值復制到系統變量將所選變量的值復制到系統變量 * *objobj*

8、* 中。中。將所選變量值加上一個單引號前綴將所選變量值加上一個單引號前綴 ,打印到控制臺窗口。,打印到控制臺窗口。對所選變量調用符號服務對話框。對所選變量調用符號服務對話框。調用自動匹配選項對話框,用所選變量名作自動匹配參數。調用自動匹配選項對話框,用所選變量名作自動匹配參數。從監視窗口中刪除所選變量。從監視窗口中刪除所選變量。圖圖6-46-4監視窗口的快捷菜單監視窗口的快捷菜單 3. 3. 將變量加入到監視窗口將變量加入到監視窗口有三種途徑可以將新的變量加入到監視窗口。有三種途徑可以將新的變量加入到監視窗口。 (1 1) 點取工具欄上的添加監視按鈕點取工具欄上的添加監視按鈕 ,在隨后彈出的圖

9、,在隨后彈出的圖6-56-5所示的所示的添加添加監視監視窗口內填入變量名,然后單擊窗口內填入變量名,然后單擊OKOK按鈕。按鈕。 圖圖6-56-5添加監視窗口添加監視窗口 (2 2)亮顯要添加的變量名,然后點取工具欄上的添加監視按鈕)亮顯要添加的變量名,然后點取工具欄上的添加監視按鈕 ,隨,隨后彈出的圖后彈出的圖6-66-6所示的已填寫了該變量名的添加監視窗口,然后單擊所示的已填寫了該變量名的添加監視窗口,然后單擊OKOK按按鈕。鈕。(3 3)將光標移至將要添加的變量名,單擊鼠標右鍵,在隨后彈出的快捷)將光標移至將要添加的變量名,單擊鼠標右鍵,在隨后彈出的快捷菜單上選取菜單上選取Add Wat

10、chAdd Watch菜單項,將彈出已填寫了該變量名的添加監視窗口,菜單項,將彈出已填寫了該變量名的添加監視窗口,然后單擊然后單擊OKOK按鈕。按鈕。 4. 4. 監視變量的值監視變量的值 監視列表的每一行的格式是監視列表的每一行的格式是 變量名變量名= =變量值變量值 ,例如:,例如:A = 1A = 1。如果程序。如果程序尚未運行,變量的值是空的;隨著程序的運行,在監視窗口可以看到變量的尚未運行,變量的值是空的;隨著程序的運行,在監視窗口可以看到變量的值也在不斷變化。值也在不斷變化。5. 5. 利用斷點和監視窗口調試程序利用斷點和監視窗口調試程序 假定在編輯器窗口已鍵入了圖假定在編輯器窗口

11、已鍵入了圖6-66-6所示的源程序。該程序的功能是根據用所示的源程序。該程序的功能是根據用戶輸入的兩個對角點繪制矩形。戶輸入的兩個對角點繪制矩形。 首先檢查該程序是否存在語法錯誤。選擇菜單首先檢查該程序是否存在語法錯誤。選擇菜單T ToolsoolsText in EditorText in Editor或或單擊按鈕,在單擊按鈕,在Build OutputBuild Output(輸出)窗口顯示(輸出)窗口顯示; Check done.; Check done.。說明該程序。說明該程序沒有語法錯誤。沒有語法錯誤。 選擇菜單選擇菜單T ToolsoolsLoad Text in EditorLo

12、ad Text in Editor或單擊按鈕或單擊按鈕 ,VisualLISPVisualLISP自自動將控制切換到動將控制切換到AutoCADAutoCAD界面。當出現界面。當出現 輸入矩形的一個角點:輸入矩形的一個角點: 的提示時,輸的提示時,輸入入(0,0)(0,0)點,該點是點,該點是p1p1點的坐標;當出現點的坐標;當出現 輸入矩形的對角點:輸入矩形的對角點: 的提示時,輸的提示時,輸入入(100,100)(100,100)點,該點是點,該點是p2p2點的坐標。程序運行結束,只得到了矩形的兩條邊,點的坐標。程序運行結束,只得到了矩形的兩條邊,顯然,這不是預期的運行結果。顯然,這不是預

13、期的運行結果。 下面演示如何利用監視窗口調試程序。調試程序的步驟如下:下面演示如何利用監視窗口調試程序。調試程序的步驟如下:(1 1)確定要監視的變量。選擇菜單)確定要監視的變量。選擇菜單D DebugebugA Add Watchdd Watch或單擊工具欄上的或單擊工具欄上的添加監視按鈕添加監視按鈕 ,在隨后彈出的添加監視窗口內填入變量名,在隨后彈出的添加監視窗口內填入變量名p1p1,然后,然后單擊單擊OKOK按鈕。用同樣的操作監視變量按鈕。用同樣的操作監視變量P2P2、P3P3、P4P4。圖圖6-66-6監視監視P1P1、P2P2、P3P3、P4P4點的值點的值(2 2)從圖)從圖6-7

14、6-7所示監視窗口可以看到:所示監視窗口可以看到:P1 = 0.0 0.0 0.0P1 = 0.0 0.0 0.0、p2 = 100.0 0.0p2 = 100.0 0.0、p3 = 100.0 100.0 0.0p3 = 100.0 100.0 0.0、P4 = nil P4 = nil 100.0100.0。說明。說明P4P4點的點的X X坐標是無定義的,而坐標是無定義的,而X X坐標是坐標是(car pl)(car pl)的的返回值,檢查返回值,檢查(car pl)(car pl),carcar是正確的,亮顯是正確的,亮顯plpl,單擊添加監,單擊添加監視按鈕視按鈕 ,監視窗口內出現,監

15、視窗口內出現PL = nilPL = nil,PLPL本不是該程序的變量,本不是該程序的變量,是是p1p1的誤寫。的誤寫。(3 3)修改源程序代碼,將)修改源程序代碼,將plpl改寫為改寫為p1p1;重新加載、運行該程;重新加載、運行該程序;直到該程序可以正常運行,調試結束。序;直到該程序可以正常運行,調試結束。6.3 6.3 在不設置斷點的情況下分步調試程序在不設置斷點的情況下分步調試程序 分步調試就是將一個完整的程序分為若干步,逐步調試。每步可以是分步調試就是將一個完整的程序分為若干步,逐步調試。每步可以是最內層的一個表達式,也可以是一個復雜的表達式,還可以是多個表達式。最內層的一個表達式

16、,也可以是一個復雜的表達式,還可以是多個表達式。可以通過設置斷點將程序分為若干段,也可以不用斷點而是通過步長將程可以通過設置斷點將程序分為若干段,也可以不用斷點而是通過步長將程序分為若干步。序分為若干步。 結合下例程序介紹幾種調試程序的方法。結合下例程序介紹幾種調試程序的方法。【例【例6-16-1】 定義繪制矩形的命令,矩形的一個角點、寬、高和旋轉角為交定義繪制矩形的命令,矩形的一個角點、寬、高和旋轉角為交互輸入的參數。互輸入的參數。程序的源代碼如下:程序的源代碼如下:(defun c:rectr(/ w h alf p1 p2 p3 p4)(defun c:rectr(/ w h alf p

17、1 p2 p3 p4) (setq p1(getpoint (setq p1(getpoint 輸入矩形的一個角點:輸入矩形的一個角點:) w (getdist p1 w (getdist p1 輸入矩形的寬:輸入矩形的寬:) h (getdist p1 h (getdist p1 輸入矩形的高輸入矩形的高: ): ) alf (getangle p1 alf (getangle p1 輸入矩形的旋轉角輸入矩形的旋轉角: ): ) ) )Walfhp1p2p3p4 (setq p2(polar p1 alf w) (setq p2(polar p1 alf w) (setq p3(polar

18、p2 (+ alf ( (setq p3(polar p2 (+ alf (* * 0.5 pi) h) 0.5 pi) h) (setq p4(polar p3 (+ alf pi) w) (setq p4(polar p3 (+ alf pi) w) (command pline p1 p2 p3 p4 c) (command pline p1 p2 p3 p4 c) (princ) (princ) )1. 1. 從第一個表達式開始,逐步調試程序從第一個表達式開始,逐步調試程序(1 1)選擇菜單)選擇菜單F FileileO Open Filepen File或單擊按鈕或單擊按鈕 ,將,將

19、 例例6-16-1所示源代碼錄所示源代碼錄入文本編輯窗口。選擇菜單入文本編輯窗口。選擇菜單D DebugebugA Add Watchdd Watch或單擊按鈕或單擊按鈕 ,監視變量,監視變量w w、h h、alfalf、p1p1、p2p2、p3p3、p4p4。選擇菜單。選擇菜單T ToolsoolsLoad Text in Load Text in E Editorditor或單擊或單擊按鈕按鈕 ,加載該程序。,加載該程序。(2 2)通過菜單)通過菜單D DebugebugStop OStop On ncece,使之處于打開的狀態。,使之處于打開的狀態。(3 3)單擊按鈕)單擊按鈕 ,切換到

20、,切換到AutoCADAutoCAD窗口,在窗口,在AutoCADAutoCAD的的CommandCommand:提示下,:提示下,鍵入鍵入rect3rect3命令。命令。Walfhp1p2p3p4 控制自動切換到控制自動切換到VisualLISPVisualLISP文本編輯窗口,監視窗口內的變文本編輯窗口,監視窗口內的變量值均為量值均為nilnil。此時光標停在。此時光標停在(defun(defun之前,整個程序被加亮顯示。之前,整個程序被加亮顯示。選取下拉菜單選取下拉菜單D Debugebug的的Step Step I Intonto項、項、F8F8功能鍵或單擊按鈕功能鍵或單擊按鈕 ,光標

21、停在光標停在(setq p1(setq p1之前,與之匹配的右括號之間被加亮顯示。單之前,與之匹配的右括號之間被加亮顯示。單擊按鈕擊按鈕 ,光標停在,光標停在(getpoint (getpoint 輸入矩形的一個角點:輸入矩形的一個角點:)之之前,并亮顯該表達式。注意,指示按鈕內的前,并亮顯該表達式。注意,指示按鈕內的II在在 ()() 之前。之前。 單擊按鈕單擊按鈕 ,程序切換到,程序切換到AutoCADAutoCAD窗口,出現窗口,出現 輸入矩形的輸入矩形的一個角點:一個角點: 的提示,輸入的提示,輸入(100,80)(100,80),程序切換到,程序切換到VisualLISPVisual

22、LISP的文本編輯窗口。光標停在的文本編輯窗口。光標停在(getpoint (getpoint 輸入矩形的一個角點:輸入矩形的一個角點:)之后,仍然亮顯該表達式。注意,指示按鈕內的之后,仍然亮顯該表達式。注意,指示按鈕內的 I I 在在 ()() 之后。之后。 單擊按鈕單擊按鈕 ,光標停在,光標停在(getdist p1 (getdist p1 輸入矩形的寬:輸入矩形的寬:)之前,并亮顯該表達式。注意,指示按鈕內的之前,并亮顯該表達式。注意,指示按鈕內的II回到回到 ()() 之之前。監視窗口內的變量前。監視窗口內的變量p1=100.0 80.0 0.0p1=100.0 80.0 0.0。重復

23、類似的操。重復類似的操作,在作,在AutoCADAutoCAD窗口輸入矩形的寬度為窗口輸入矩形的寬度為200200、高度為、高度為150150,旋轉角,旋轉角為為3030。在操作過程中指示按鈕隨時顯示著光標相對于表達式的位。在操作過程中指示按鈕隨時顯示著光標相對于表達式的位置,監視窗口顯示著這些變量的當前值(注意,置,監視窗口顯示著這些變量的當前值(注意,alfalf的單位為弧的單位為弧度)。也說明單擊按鈕度)。也說明單擊按鈕 只執行了一步表達式求值。只執行了一步表達式求值。 當光標停在當光標停在(setq p3(polar p2 (+ alf (setq p3(polar p2 (+ alf

24、 (* * 0.5 pi) h) 0.5 pi) h)之之前時,單擊按鈕前時,單擊按鈕 ,整個程序被加亮顯示,光標停在整個程序,整個程序被加亮顯示,光標停在整個程序的結尾,再單擊以上任一按鈕,程序運行結束。的結尾,再單擊以上任一按鈕,程序運行結束。 切換到切換到AutoCADAutoCAD窗口,顯示著剛才繪制的矩形。窗口,顯示著剛才繪制的矩形。 假定程序的第假定程序的第5 5行誤寫為行誤寫為 (getangl p1 (getangl p1 輸入矩形的旋轉輸入矩形的旋轉角角: ): ),仍舊用上述的方法調試該程序,當執行到,仍舊用上述的方法調試該程序,當執行到 輸入矩形的輸入矩形的旋轉角旋轉角:

25、 : 時,將出現提示時,將出現提示 ; error: no function definition: ; error: no function definition: GETANGLGETANGL(沒有(沒有GETANGLGETANGL這個函數定義)這個函數定義) 。點取查找按鈕。點取查找按鈕 ,在隨后彈出的在隨后彈出的 FIND FIND 對話框的對話框的FiFin ndWhatdWhat編輯框輸入查找內容為編輯框輸入查找內容為 GETANGLGETANGL ,單擊,單擊 F Findind按鈕,找到按鈕,找到getanglgetangl并改正為并改正為getanglegetangle。 重

26、新調試程序,直至程序正常運行。重新調試程序,直至程序正常運行。2. 2. 自動分步調試程序自動分步調試程序(1 1)自動分步調試程序的步驟)自動分步調試程序的步驟 將例將例6-16-1源代碼的文件裝入文本編輯窗口。監視變量源代碼的文件裝入文本編輯窗口。監視變量w w、h h、alfalf、p1p1、p2p2、p3p3、p4p4。加載該程序。選擇菜單。加載該程序。選擇菜單D DebugebugAnimatAnimate e。 在在AutoCADAutoCAD的的CommandCommand: 提示下,鍵入提示下,鍵入rect3rect3命令。命令。Visua Visua lLISPlLISP自動

27、切換到文本編輯窗口。隨著光標的位置、指示按鈕自動切換到文本編輯窗口。隨著光標的位置、指示按鈕 內內II和和 ()() 的變化,自動地執行每一個表達式的求值,監視的變化,自動地執行每一個表達式的求值,監視窗口內的變量值也相應地改變。如果遇到了錯誤的函數調用,窗口內的變量值也相應地改變。如果遇到了錯誤的函數調用,程序停止運行,并報告程序停止運行,并報告 ; error: no function definition: ; error: no function definition: 信息。找到并改正錯誤的函數。繼續調試程序,直至程序正信息。找到并改正錯誤的函數。繼續調試程序,直至程序正常運行。常運

28、行。(2 2)設置每步延遲的時間)設置每步延遲的時間 選擇菜單選擇菜單T ToolsoolsEnvironmant Environmant O OptionsptionsG General eneral O Options ptions 彈出圖彈出圖6-76-7所示所示General General O Optionsptions對話框。單對話框。單擊該對話框的擊該對話框的DiagnosticDiagnostic(診斷)卡,在(診斷)卡,在A Animation nimation delaydelay編輯框輸入每步延遲的時間(以毫秒為單位),編輯框輸入每步延遲的時間(以毫秒為單位),單擊確定按

29、鈕即可。單擊確定按鈕即可。圖圖6-76-7診斷選項卡診斷選項卡 6.4 6.4 斷點循環斷點循環 表達式是表達式是AutoLISPAutoLISP程序的基本單元,程序的基本單元,LISPLISP的工作實際上是不的工作實際上是不斷地對表達式進行讀入、求值和輸出操作,在斷地對表達式進行讀入、求值和輸出操作,在LISPLISP術語中,被稱術語中,被稱為讀算寫循環。為讀算寫循環。 如果不用調試工具而是正常地運行如果不用調試工具而是正常地運行AutoLISPAutoLISP程序時,程序將程序時,程序將處于頂層的讀算寫循環。如果在處于頂層的讀算寫循環。如果在VisualLISPVisualLISP控制臺窗

30、口內對表達控制臺窗口內對表達式求值時,也是處于頂層的讀算寫循環。式求值時,也是處于頂層的讀算寫循環。 如果程序在運行時被中斷或掛起,如果程序在運行時被中斷或掛起,VisualLISPVisualLISP將控制轉交給將控制轉交給控制臺,就進入了斷點循環(控制臺,就進入了斷點循環(Break loopBreak loop)。斷點循環是一個單)。斷點循環是一個單獨的讀算寫循環,它嵌套在原有的讀算寫循環內。斷點循環也可獨的讀算寫循環,它嵌套在原有的讀算寫循環內。斷點循環也可以被中斷,這時將開始一個嵌套于該斷點循環內的讀算寫循環。以被中斷,這時將開始一個嵌套于該斷點循環內的讀算寫循環。斷點循環相對于頂層

31、循環嵌套的層數稱為該中斷的層數。斷點循環相對于頂層循環嵌套的層數稱為該中斷的層數。 進入斷點循環時,進入斷點循環時,VisualLISPVisualLISP將在控制臺提示將在控制臺提示_$_$前加一個數字來指出所處循環的層數。例如,當首次進前加一個數字來指出所處循環的層數。例如,當首次進入程序的斷點循環時,提示為入程序的斷點循環時,提示為_1_$_1_$。如果處于斷點循。如果處于斷點循環狀態,就不能將控制切換到環狀態,就不能將控制切換到AutoCADAutoCAD窗口。窗口。 從斷點循環退出,將恢復上一層循環。如果在該從斷點循環退出,將恢復上一層循環。如果在該斷點循環中修改了某變量的值,程序繼

32、續運行時將使用斷點循環中修改了某變量的值,程序繼續運行時將使用變量修改后的值。變量修改后的值。斷點循環分為斷點循環分為可繼續斷點循環可繼續斷點循環和和不可繼續斷點循環不可繼續斷點循環。1. 1. 可繼續的斷點循環可繼續的斷點循環 可繼續的斷點循環是指可以在程序中斷處,繼續向下執行剩可繼續的斷點循環是指可以在程序中斷處,繼續向下執行剩余的表達式。用以下方法進入可繼續斷點循環:余的表達式。用以下方法進入可繼續斷點循環:(1 1)打開)打開Stop OnceStop Once模式,碰到帶調試信息的表達式時。模式,碰到帶調試信息的表達式時。(2 2)遇到帶)遇到帶Debug on EntryDebug

33、 on Entry(進入時調試)標志的函數時。(進入時調試)標志的函數時。(3 3)遇到程序中設置的斷點時。)遇到程序中設置的斷點時。(4 4)單擊暫停按鈕進入斷點循環時。)單擊暫停按鈕進入斷點循環時。(5 5)在前一個斷點循環狀態下,執行)在前一個斷點循環狀態下,執行Step IntoStep Into、Step OverStep Over或或Step OutStep Out時。時。 如果程序在某函數中被中斷,可以訪問被該函數聲明的局部如果程序在某函數中被中斷,可以訪問被該函數聲明的局部變量,甚至可以在控制臺提示下用變量,甚至可以在控制臺提示下用setqsetq函數修改它們的值。函數修改它們

34、的值。2. 2. 不可繼續的斷點循環不可繼續的斷點循環 當程序出現錯誤導致崩潰時,如果設置了當程序出現錯誤導致崩潰時,如果設置了Break On ErrorBreak On Error選選項,將激活一個不可繼續的斷點循環。此時可以訪問出錯環境項,將激活一個不可繼續的斷點循環。此時可以訪問出錯環境中的所有變量,但不能繼續執行程序或執行任何單步調試程序中的所有變量,但不能繼續執行程序或執行任何單步調試程序的命令。的命令。 如果工具欄上的單步調試的按鈕如果工具欄上的單步調試的按鈕 、 、 或繼續運行或繼續運行的按鈕的按鈕 處于可用狀態,說明此時進入了可繼續的斷點循環。處于可用狀態,說明此時進入了可繼

35、續的斷點循環。 處于不可繼續的斷點循環時,選取處于不可繼續的斷點循環時,選取D Debugebug菜單的菜單的R Reset to eset to Top LevelTop Level項或單擊按鈕項或單擊按鈕 ,退出斷點循環并跳轉至控制臺頂,退出斷點循環并跳轉至控制臺頂層循環;選取層循環;選取D Debugebug菜單的菜單的Q Quit Currentuit Current項或單擊按鈕項或單擊按鈕 ,退,退出斷點循環并返回到上一層循環。出斷點循環并返回到上一層循環。6.5 6.5 利用斷點調試程序利用斷點調試程序 運行的程序遇到斷點時,將產生一個中斷。當程序中斷時運行的程序遇到斷點時,將產生

36、一個中斷。當程序中斷時, ,可查看、分析變量的值,修改程序的源代碼。利用斷點可提高可查看、分析變量的值,修改程序的源代碼。利用斷點可提高調試程序的效率。調試程序的效率。1. 1. 有關斷點的操作有關斷點的操作(1 1)在程序中設置)在程序中設置/ /刪除斷點刪除斷點 只能在只能在VisualLISPVisualLISP的文本編輯器窗口內設置斷點。斷點應位的文本編輯器窗口內設置斷點。斷點應位于表達式的左、右括號上。設置斷點的步驟如下:于表達式的左、右括號上。設置斷點的步驟如下: 將光標移到需要程序暫停的位置。例如,需要在某表達式將光標移到需要程序暫停的位置。例如,需要在某表達式 之前暫停,則應將

37、光標移至與表達式的左括號相鄰的位置。之前暫停,則應將光標移至與表達式的左括號相鄰的位置。26 選擇菜單選擇菜單D DebugebugT Toggle Breakpointoggle Breakpoint、單擊按鈕、單擊按鈕 或按或按F9F9鍵。如果該位置沒有斷點,就加入一個斷點,否則,刪除該鍵。如果該位置沒有斷點,就加入一個斷點,否則,刪除該斷點。單擊鼠標右鍵在快捷菜單中選擇斷點。單擊鼠標右鍵在快捷菜單中選擇Toggle BreakpointToggle Breakpoint項項也可以設置或刪除斷點。如果光標不與括號相鄰,也可以設置或刪除斷點。如果光標不與括號相鄰,Visual Visual

38、LISPLISP暫時將光標移到后面最近的右括號處,并通過對話框詢問暫時將光標移到后面最近的右括號處,并通過對話框詢問用戶是否在該處設置斷點。用戶是否在該處設置斷點。 選擇菜單選擇菜單D DebugClear All ebugClear All B Breakpointsreakpoints項,刪除已設置項,刪除已設置的所有斷點。的所有斷點。(2 2)改變斷點的顏色)改變斷點的顏色 VisualLISPVisualLISP用高亮矩形顯示每一個斷點,默認情況下,活動的斷點是紅色用高亮矩形顯示每一個斷點,默認情況下,活動的斷點是紅色的。選擇菜單的。選擇菜單T ToolsoolsW Window At

39、tributesindow AttributesC Configure Current onfigure Current ,通過隨后,通過隨后彈出的彈出的Window AttributesWindow Attributes對話框內的對話框內的WINDOW-TEXTWINDOW-TEXT下拉列表的下拉列表的:BPT-ACTIVE:BPT-ACTIVE項項可改變斷點的顏色。可改變斷點的顏色。(3 3)臨時禁用斷點)臨時禁用斷點 斷點可以被臨時禁用和恢復使用。禁用斷點的步驟如下:斷點可以被臨時禁用和恢復使用。禁用斷點的步驟如下: 將光標置于斷點處并單擊鼠標右鍵。將光標置于斷點處并單擊鼠標右鍵。 從顯

40、示的快捷菜單上選擇從顯示的快捷菜單上選擇Breakpoints serviceBreakpoints service項,將彈出圖項,將彈出圖6-86-8所示斷所示斷點服務對話框。點服務對話框。圖圖6-86-8斷點服務對話框斷點服務對話框 在斷點服務對話框中單擊在斷點服務對話框中單擊D Disableisable按鈕可臨時禁用該斷點;若該斷點已被按鈕可臨時禁用該斷點;若該斷點已被禁用,圖禁用,圖6-96-9所示斷點服務對話框將出現所示斷點服務對話框將出現E Enablenable按鈕,單擊該按鈕,所選斷點按鈕,單擊該按鈕,所選斷點將改變為可用狀態。將改變為可用狀態。 默認情況下,被禁用的斷點顯示

41、為藍色。用設置斷點顏色的方法也可以改默認情況下,被禁用的斷點顯示為藍色。用設置斷點顏色的方法也可以改變被禁用斷點的顏色。變被禁用斷點的顏色。(4 4)瀏覽和編輯程序中的斷點)瀏覽和編輯程序中的斷點 選擇菜單選擇菜單V ViewBreaiewBreak kpoints Windowpoints Window將看到圖將看到圖6-96-9所示的斷點對話框。所示的斷點對話框。圖圖6-96-9斷點對話框斷點對話框 該斷點窗口列出了所有編輯器窗口的斷點。其中有程序該斷點窗口列出了所有編輯器窗口的斷點。其中有程序6-1.lsp6-1.lsp的的3 3個斷個斷點、點、 6-2.lsp6-2.lsp的的2 2個

42、斷點。每項包含斷點的源文件名以及斷點在源文件中的個斷點。每項包含斷點的源文件名以及斷點在源文件中的位置,位置是以位置,位置是以0 0開始的西文字符數量,前面的開始的西文字符數量,前面的+號表示該斷點是活動的,號表示該斷點是活動的,- - 號表示該斷點是被禁用的。號表示該斷點是被禁用的。 單擊該對話框的單擊該對話框的Delete allDelete all按鈕可以刪除所有的斷點;亮顯一項,單擊按鈕可以刪除所有的斷點;亮顯一項,單擊S Showhow按鈕可顯示該斷點所在的源文件及其在源文件中的位置;單擊按鈕可顯示該斷點所在的源文件及其在源文件中的位置;單擊DeleteDelete按按鈕可刪除該斷點

43、;單擊鈕可刪除該斷點;單擊E Editdit按鈕可打開圖按鈕可打開圖6-96-9所示的斷點服務對話框,利用所示的斷點服務對話框,利用該對話框可以改變斷點可用或禁用的狀態。該對話框可以改變斷點可用或禁用的狀態。(5 5) 斷點的生命周期斷點的生命周期 可以在加載程序之前或之后設置斷點。如果在加載程序之后設置斷點,可以在加載程序之前或之后設置斷點。如果在加載程序之后設置斷點,該斷點只有在重新加載程序之后才有效。該斷點只有在重新加載程序之后才有效。2. 2. 在斷點處繼續運行程序在斷點處繼續運行程序 運行的程序遇到斷點時,將產生一個中斷,即斷點循環。單運行的程序遇到斷點時,將產生一個中斷,即斷點循環

44、。單擊分布調試按鈕擊分布調試按鈕 、 和和 可繼續運行程序。如果在復雜的可繼續運行程序。如果在復雜的表達式之內還有一些斷點,單擊按鈕表達式之內還有一些斷點,單擊按鈕 和和 ,首先在斷點處暫,首先在斷點處暫停。此外還有以下控制程序繼續運行的工具欄按鈕、快捷鍵或停。此外還有以下控制程序繼續運行的工具欄按鈕、快捷鍵或D Debugebug菜單的菜單項。菜單的菜單項。 ContinueContinue或或CtrlCtrl+ +F8F8:繼續執行程序直至遇到下一個斷點:繼續執行程序直至遇到下一個斷點(如果有)或程序結束。(如果有)或程序結束。 Quit CurrentQuit Current或或Ctrl

45、Ctrl+ +Q Q:結束當前程序,返回到控制臺的:結束當前程序,返回到控制臺的上一層斷點循環。上一層斷點循環。 Reset to Top LevelReset to Top Level或或CtrlCtrl+ +R R:結束當前程序,結束所有:結束當前程序,結束所有的斷點循環。的斷點循環。3. 3. 利用斷點調試程序實例利用斷點調試程序實例【例【例6-26-2】 定義繪制圖定義繪制圖6-106-10所示圖形的命令,所示圖形的命令,p0p0、d d、b b、t1t1、alfalf是交互輸是交互輸入的參數。入的參數。圖圖6-106-10軸的鍵槽部位截面軸的鍵槽部位截面 程序源代碼如下:程序源代碼如

46、下:(defun c:tuxing (/ p0 alf d b t1 r l b1 sit p1 p2 p3 p4 p5)(defun c:tuxing (/ p0 alf d b t1 r l b1 sit p1 p2 p3 p4 p5)(setq p0 (getpoint nEnter P0: )(setq p0 (getpoint nEnter P0: )(setq d (getdist p0 nEnter d: )(setq d (getdist p0 nEnter d: ) (setq b (getdist p0 nEnter b: ) (setq b (getdist p0 nEn

47、ter b: ) (setq tl (getdist p0 nEnter t1: ) (setq tl (getdist p0 nEnter t1: ) ;tl;tl應改為應改為t1t1 (setq alf (getangle p0 nEnter alf: ) (setq alf (getangle p0 nEnter alf: ) ;斷點;斷點1 1的位置的位置 (setq r (setq r (* * 0.5 d) bl ( 0.5 d) bl (* * 0.5 b) 0.5 b) (setq l (sqrt (- ( (setq l (sqrt (- (* * r r) ( r r) (

48、* * b1 b1) b1 b1) (setq sit (tan b1 l) (setq sit (tan b1 l) ;tan;tan應改為應改為atanatan (setq p1 (polar p0 (+ alf sit) r) (setq p1 (polar p0 (+ alf sit) r) (setq p2 (polar p0 (+ pi alf) r) (setq p2 (polar p0 (+ pi alf) r) (setq p3 (polar p0 (- alf sit) r) (setq p3 (polar p0 (- alf sit) r) (setq p4 (polar

49、 p3 (+ pi alf) (- (+ r l) t1) (setq p4 (polar p3 (+ pi alf) (- (+ r l) t1) (setq p5 (polar p1 (+ alf pi) (- (+ r l) t1) (setq p5 (polar p1 (+ alf pi) (- (+ r l) t1) (command pline p1 a s p2 p3 l p4 p5 c) (command pline p1 a s p2 p3 l p4 p5 c) ) 選擇菜單選擇菜單F FileileO Open Filepen File將例將例6-26-2所示源代碼的文件裝

50、入文所示源代碼的文件裝入文本編輯窗口。選擇菜單本編輯窗口。選擇菜單D DebugebugA Add Watchdd Watch或單擊按鈕或單擊按鈕 ,監視,監視變量變量p0p0、d d、b b、t1t1、alfalf、r r、l l、b1b1、sitsit、p1p1、p2p2、p3p3、p4p4、p5p5。 加載該程序,單擊按鈕加載該程序,單擊按鈕 ,在,在AutoCADAutoCAD的的Command:Command:提示下鍵入提示下鍵入TUXINGTUXING命令,程序停止運行,出現提示命令,程序停止運行,出現提示;error: bad argument ;error: bad argum

51、ent type: numberp: niltype: numberp: nil(錯誤的參數類型,出現了無定義的參數)(錯誤的參數類型,出現了無定義的參數) 。 將光標移至程序的第將光標移至程序的第6 6行末尾,選擇菜單行末尾,選擇菜單D DebugebugT Toggle oggle BreakpointBreakpoint、按功能鍵、按功能鍵F9F9或單擊按鈕或單擊按鈕 ,在該處設置一個斷點。,在該處設置一個斷點。34 單擊按鈕單擊按鈕 ,加載當前文本編輯窗口內的源程序。單擊,加載當前文本編輯窗口內的源程序。單擊按鈕按鈕 ,在,在Command:Command:提示下鍵入提示下鍵入TUXI

52、NGTUXING命令,依次輸入命令,依次輸入p0p0、d d、b b、t1t1、alfalf的值之后,回到文本編輯窗口。光標停留在斷的值之后,回到文本編輯窗口。光標停留在斷點點1 1的位置,說明已執行了的位置,說明已執行了5 5個個getget表達式。表達式。 瀏覽監視窗口,瀏覽監視窗口,p0p0、d d、b b、alfalf已有具體的數值,而已有具體的數值,而T1=nilT1=nil,說明表達式(,說明表達式(setq tl (getdist p0 nEnter t1: setq tl (getdist p0 nEnter t1: ))有錯誤,仔細檢查,發現誤將)有錯誤,仔細檢查,發現誤將t

53、1t1寫為寫為tltl。改正之后,單擊。改正之后,單擊按鈕按鈕 ,單擊按鈕,單擊按鈕 ,在,在Command:Command:提示下鍵入提示下鍵入TUXINGTUXING命令,命令,依次輸入依次輸入p0p0等的數據,當程序停留在斷點等的數據,當程序停留在斷點1 1的位置時,瀏覽監的位置時,瀏覽監視窗口視窗口t1t1已有定義了。已有定義了。 單擊繼續按鈕單擊繼續按鈕 ,程序停止運行,出現提示,程序停止運行,出現提示; error: no ; error: no function definition: TANfunction definition: TAN(錯誤,沒有定義函數:(錯誤,沒有定義函

54、數:TANTAN) ,正確的函數應該是蘭色的,找到黑色的函數名正確的函數應該是蘭色的,找到黑色的函數名tantan,改正為,改正為atanatan。 將光標移至斷點將光標移至斷點1 1處單擊按鈕處單擊按鈕 ,刪除斷點,刪除斷點1 1。單擊按鈕。單擊按鈕 ,在,在Command:Command:提示下鍵入提示下鍵入TUXINGTUXING命令,依次命令,依次輸入輸入p0p0等的數據,程序正常結束,并得到等的數據,程序正常結束,并得到圖圖6-106-10所示圖形。所示圖形。圖圖6-106-10 在此例中,在斷點在此例中,在斷點1 1暫停時,調試按鈕從暫停時,調試按鈕從 到到 都處于可都處于可用狀態

55、,因為此時處于可繼續的斷點循環。用狀態,因為此時處于可繼續的斷點循環。 如果運行該程序前,選擇菜單如果運行該程序前,選擇菜單D DebugebugBreaBreak k On Error On Error,執行,執行到到tantan函數時,因出現了無定義的函數而程序崩潰,但在該處函數時,因出現了無定義的函數而程序崩潰,但在該處產生了一個不可繼續的斷點循環。此時只有調試按鈕產生了一個不可繼續的斷點循環。此時只有調試按鈕 和和是可用的。用戶只能選擇退到上一層斷點循環還是退到頂層斷是可用的。用戶只能選擇退到上一層斷點循環還是退到頂層斷點循環。點循環。 如果在如果在CommandCommand:提示下

56、,鍵入:提示下,鍵入TUXINGTUXING命令,在要求用戶輸入命令,在要求用戶輸入數據時,按下數據時,按下EscEsc鍵,程序停止運行,此時也產生了一個不可鍵,程序停止運行,此時也產生了一個不可繼續的斷點循環。繼續的斷點循環。6.6 6.6 跟蹤程序運行跟蹤程序運行 跟蹤程序運行的工具有命令跟蹤、出錯跟蹤和跟蹤堆棧。跟蹤程序運行的工具有命令跟蹤、出錯跟蹤和跟蹤堆棧。1. 1. 命令跟蹤命令跟蹤 如果打開命令跟蹤模式,如果打開命令跟蹤模式,VisualLISPVisualLISP將在窗口跟蹤有關將在窗口跟蹤有關AutoCADAutoCAD命令的執命令的執行情況,以便監控程序是否在執行行情況,以

57、便監控程序是否在執行AutoCADAutoCAD命令時出現了問題。命令時出現了問題。 例如,選擇菜單例如,選擇菜單D DebugebugTrace CoTrace Com mmandmand,在,在CommandCommand:提示下,鍵入:提示下,鍵入TUXINGTUXING命令(假定程序能夠正常運行),將在圖命令(假定程序能夠正常運行),將在圖6-116-11所示所示 TraceTrace 窗口顯示窗口顯示有關有關AutoCADAutoCAD命令的執行情況的信息。命令的執行情況的信息。圖圖6-116-11顯示有關顯示有關AutoCADAutoCAD命令的執行情況的跟蹤窗口命令的執行情況的跟

58、蹤窗口 2. 2. 出錯跟蹤出錯跟蹤 出錯跟蹤是用出錯跟蹤是用Error TraceError Trace窗口錄跟蹤程序運行的結果。在跟蹤窗口窗口錄跟蹤程序運行的結果。在跟蹤窗口按鼠標右鍵,將彈出跟蹤窗口的快捷菜單,見圖按鼠標右鍵,將彈出跟蹤窗口的快捷菜單,見圖6-136-13。下面以例下面以例6-36-3為例,介紹利用為例,介紹利用Error TraceError Trace窗口調試程序的方法。窗口調試程序的方法。【例【例6-36-3】定義求解一元二次方程的函數】定義求解一元二次方程的函數一元二次方程的表達式為:一元二次方程的表達式為: 如果如果 a=0a=0,它不是一個二次方程;如果,方程

59、有實數解,否則無解。,它不是一個二次方程;如果,方程有實數解,否則無解。方程的求根公式為:方程的求根公式為:aacbbx242程序內容如下:程序內容如下: (defun roots(a b c / t1 t2 x1 x2) (defun roots(a b c / t1 t2 x1 x2) ;t1t1、t2t2、x1x1、x2x2是局部變量是局部變量 (if (/= a 0)(if (/= a 0) (progn (progn (setq t1 (- ( (setq t1 (- (* * b b) ( b b) (* * 4 a c) 4 a c) ; (if (= t1 0.0)(if (=

60、 t1 0.0) (progn (progn (setq t2 (sqrt t1) (setq t2 (sqrt t1) ; (setq x1 (/ (+ -b t2) (setq x1 (/ (+ -b t2) (* * 2 a) 2 a) ;此處有錯;此處有錯 (setq x2 (/ (- -b t2) (setq x2 (/ (- -b t2) (* * 2 a) 2 a) ;此處有錯;此處有錯 (print (list x1 x2)(print (list x1 x2) ) ) (print n (print n根是復數根是復數.).) ) ) ) ) (print n (print

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論