




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第 6 章 調(diào)試程序,6.1 概述 語(yǔ)法正確的程序并不能保證正常運(yùn)行,在運(yùn)行時(shí)可能會(huì)產(chǎn)生錯(cuò)誤的結(jié)果或者發(fā)生崩潰現(xiàn)象,這就需要調(diào)試。 調(diào)試程序的步驟是: 控制程序在指定的位置暫停; 查看、分析有關(guān)變量的值; 修改程序的源代碼; 繼續(xù)或重新運(yùn)行程序; 如果程序不能正常運(yùn)行,繼續(xù)調(diào)試程序,直至程序正常運(yùn)行。 為了便于調(diào)試程序,Visual LISP提供了一些調(diào)試程序的工具,幫助用戶迅速查找并改正程序中的錯(cuò)誤。 VisualLISP提供了監(jiān)視窗口、檢驗(yàn)窗口、符號(hào)服務(wù)對(duì)話框、中斷和繼續(xù)執(zhí)行程序的模式、命令跟蹤、跟蹤堆棧、跟蹤窗口等調(diào)試程序的工具。,通過(guò)圖6-1示View下拉菜單和View工具欄可以調(diào)用監(jiān)
2、視窗口、檢驗(yàn)窗口等調(diào)試工具。,檢驗(yàn)窗口 跟蹤堆棧 出錯(cuò)跟蹤 符號(hào)服務(wù) 監(jiān)視窗口 自動(dòng)匹配窗口 斷點(diǎn)窗口 編譯輸出窗口 VisualLISP控制臺(tái) 瀏覽圖形數(shù)據(jù)庫(kù) 選擇工具欄,圖6-1 View下拉菜單,打開(kāi)監(jiān)視窗口 匹配 符號(hào)服務(wù) 堆棧跟蹤功能 打開(kāi)檢測(cè)窗口 激活控制臺(tái)窗口 確定活動(dòng)窗口 切換到AutoCAD圖形窗口,通過(guò)圖6-2所示Debug下拉菜單和Debug工具欄的選項(xiàng)可以設(shè)置程序暫停的模式和繼續(xù)程序運(yùn)行的方式。,只執(zhí)行一步表達(dá)式求值。 執(zhí)行到下一個(gè)斷點(diǎn),如無(wú)斷點(diǎn),則執(zhí)行一個(gè)完整的表達(dá)式求值。 執(zhí)行到下一個(gè)斷點(diǎn),如無(wú)斷點(diǎn),則執(zhí)行一個(gè)最外層的表達(dá)式求值。 繼續(xù)執(zhí)行程序 結(jié)束當(dāng)前程序。返回到
3、控制臺(tái)的上一層中斷頂層讀算寫循環(huán)。 結(jié)束所有當(dāng)前活動(dòng)的斷點(diǎn)循環(huán)并返回到控制臺(tái)的頂層讀算寫循環(huán)。 添加監(jiān)視 回到最近一次監(jiān)視窗口的環(huán)境 設(shè)置/刪除斷點(diǎn) 清除所有的斷點(diǎn) 回到源程序上的最近一次的斷點(diǎn) 跟蹤命令 立即暫停 出錯(cuò)斷開(kāi) 自動(dòng)運(yùn)行 終止求值,圖6-2 Debug下拉菜單,調(diào)試指示器按鈕 顯示上一個(gè)斷點(diǎn) 添加監(jiān)視 設(shè)置或取消斷點(diǎn)切換 重置為頂層 退出當(dāng)前層 繼續(xù)執(zhí)行 跳出表達(dá)式 下一個(gè)表達(dá)式 下一層嵌套表達(dá)式,Debug工具欄,6.2 監(jiān)視窗口 監(jiān)視窗口用于監(jiān)視變量、函數(shù)在程序運(yùn)行過(guò)程中的結(jié)果。選擇菜單DebugWatch Last Evaluation。將彈出圖6-3所示的監(jiān)視窗口。,圖6
4、-3 監(jiān)視窗口,1. 監(jiān)視窗口的工具欄 監(jiān)視窗口的工具欄有四個(gè)圖像按鈕,從左至右依次是: 添加監(jiān)視:將新的變量加入到監(jiān)視窗口。 清除變量:清除監(jiān)視窗口內(nèi)的所有的變量。 排序:將監(jiān)視窗口內(nèi)的變量名按字母順序排序。 復(fù)制到跟蹤/日志:將監(jiān)視窗口的內(nèi)容復(fù)制到跟蹤窗口。 如果打開(kāi)了日志選項(xiàng),監(jiān)視窗口中的這些內(nèi)容也將被復(fù)制到跟蹤日志文件。,2. 監(jiān)視窗口的快捷菜單 選擇監(jiān)視列表中的某一項(xiàng)并單擊鼠標(biāo)右鍵,可顯示圖6-4所示監(jiān)視窗口的快捷菜單。,調(diào)用檢驗(yàn)功能,查看所選值。 將所選變量的值復(fù)制到系統(tǒng)變量 *obj* 中。 將所選變量值加上一個(gè)單引號(hào)前綴,打印到控制臺(tái)窗口。 對(duì)所選變量調(diào)用符號(hào)服務(wù)對(duì)話框。 調(diào)用
5、自動(dòng)匹配選項(xiàng)對(duì)話框,用所選變量名作自動(dòng)匹配參數(shù)。 從監(jiān)視窗口中刪除所選變量。,圖6-4監(jiān)視窗口的快捷菜單,3. 將變量加入到監(jiān)視窗口 有三種途徑可以將新的變量加入到監(jiān)視窗口。,(1) 點(diǎn)取工具欄上的添加監(jiān)視按鈕 ,在隨后彈出的圖6-5所示的添加監(jiān)視窗口內(nèi)填入變量名,然后單擊OK按鈕。,圖6-5添加監(jiān)視窗口,(2)亮顯要添加的變量名,然后點(diǎn)取工具欄上的添加監(jiān)視按鈕 ,隨后彈出的圖6-6所示的已填寫了該變量名的添加監(jiān)視窗口,然后單擊OK按鈕。 (3)將光標(biāo)移至將要添加的變量名,單擊鼠標(biāo)右鍵,在隨后彈出的快捷菜單上選取Add Watch菜單項(xiàng),將彈出已填寫了該變量名的添加監(jiān)視窗口,然后單擊OK按鈕。
6、,4. 監(jiān)視變量的值 監(jiān)視列表的每一行的格式是變量名=變量值,例如:A = 1。如果程序尚未運(yùn)行,變量的值是空的;隨著程序的運(yùn)行,在監(jiān)視窗口可以看到變量的值也在不斷變化。 5. 利用斷點(diǎn)和監(jiān)視窗口調(diào)試程序 假定在編輯器窗口已鍵入了圖6-6所示的源程序。該程序的功能是根據(jù)用戶輸入的兩個(gè)對(duì)角點(diǎn)繪制矩形。 首先檢查該程序是否存在語(yǔ)法錯(cuò)誤。選擇菜單ToolsText in Editor或單擊按鈕,在Build Output(輸出)窗口顯示; Check done.。說(shuō)明該程序沒(méi)有語(yǔ)法錯(cuò)誤。 選擇菜單ToolsLoad Text in Editor或單擊按鈕 ,VisualLISP自動(dòng)將控制切換到Aut
7、oCAD界面。當(dāng)出現(xiàn)輸入矩形的一個(gè)角點(diǎn):的提示時(shí),輸入(0,0)點(diǎn),該點(diǎn)是p1點(diǎn)的坐標(biāo);當(dāng)出現(xiàn)輸入矩形的對(duì)角點(diǎn):的提示時(shí),輸入(100,100)點(diǎn),該點(diǎn)是p2點(diǎn)的坐標(biāo)。程序運(yùn)行結(jié)束,只得到了矩形的兩條邊,顯然,這不是預(yù)期的運(yùn)行結(jié)果。,下面演示如何利用監(jiān)視窗口調(diào)試程序。調(diào)試程序的步驟如下: (1)確定要監(jiān)視的變量。選擇菜單DebugAdd Watch或單擊工具欄上的添加監(jiān)視按鈕 ,在隨后彈出的添加監(jiān)視窗口內(nèi)填入變量名p1,然后單擊OK按鈕。用同樣的操作監(jiān)視變量P2、P3、P4。,圖6-6監(jiān)視P1、P2、P3、P4點(diǎn)的值,(2)從圖6-7所示監(jiān)視窗口可以看到:P1 = 0.0 0.0 0.0、p2
8、 = 100.0 0.0、p3 = 100.0 100.0 0.0、P4 = nil 100.0。說(shuō)明P4點(diǎn)的X坐標(biāo)是無(wú)定義的,而X坐標(biāo)是(car pl)的返回值,檢查(car pl),car是正確的,亮顯pl,單擊添加監(jiān)視按鈕 ,監(jiān)視窗口內(nèi)出現(xiàn)PL = nil,PL本不是該程序的變量,是p1的誤寫。 (3)修改源程序代碼,將pl改寫為p1;重新加載、運(yùn)行該程序;直到該程序可以正常運(yùn)行,調(diào)試結(jié)束。,6.3 在不設(shè)置斷點(diǎn)的情況下分步調(diào)試程序 分步調(diào)試就是將一個(gè)完整的程序分為若干步,逐步調(diào)試。每步可以是最內(nèi)層的一個(gè)表達(dá)式,也可以是一個(gè)復(fù)雜的表達(dá)式,還可以是多個(gè)表達(dá)式??梢酝ㄟ^(guò)設(shè)置斷點(diǎn)將程序分為若干
9、段,也可以不用斷點(diǎn)而是通過(guò)步長(zhǎng)將程序分為若干步。 結(jié)合下例程序介紹幾種調(diào)試程序的方法。 【例6-1】 定義繪制矩形的命令,矩形的一個(gè)角點(diǎn)、寬、高和旋轉(zhuǎn)角為交互輸入的參數(shù)。 程序的源代碼如下: (defun c:rectr(/ w h alf p1 p2 p3 p4) (setq p1(getpoint 輸入矩形的一個(gè)角點(diǎn):) w (getdist p1 輸入矩形的寬:) h (getdist p1 輸入矩形的高: ) alf (getangle p1 輸入矩形的旋轉(zhuǎn)角: ) ),(setq p2(polar p1 alf w) (setq p3(polar p2 (+ alf (* 0.5 p
10、i) h) (setq p4(polar p3 (+ alf pi) w) (command pline p1 p2 p3 p4 c) (princ) ) 1. 從第一個(gè)表達(dá)式開(kāi)始,逐步調(diào)試程序 (1)選擇菜單FileOpen File或單擊按鈕 ,將例6-1所示源代碼錄入文本編輯窗口。選擇菜單DebugAdd Watch或單擊按鈕 ,監(jiān)視變量w、h、alf、p1、p2、p3、p4。選擇菜單ToolsLoad Text in Editor或單擊按鈕 ,加載該程序。 (2)通過(guò)菜單DebugStop Once,使之處于打開(kāi)的狀態(tài)。 (3)單擊按鈕 ,切換到AutoCAD窗口,在AutoCAD的C
11、ommand:提示下,鍵入rect3命令。,控制自動(dòng)切換到VisualLISP文本編輯窗口,監(jiān)視窗口內(nèi)的變量值均為nil。此時(shí)光標(biāo)停在(defun之前,整個(gè)程序被加亮顯示。選取下拉菜單Debug的Step Into項(xiàng)、F8功能鍵或單擊按鈕 ,光標(biāo)停在(setq p1之前,與之匹配的右括號(hào)之間被加亮顯示。單擊按鈕 ,光標(biāo)停在(getpoint 輸入矩形的一個(gè)角點(diǎn):)之前,并亮顯該表達(dá)式。注意,指示按鈕內(nèi)的I在() 之前。 單擊按鈕 ,程序切換到AutoCAD窗口,出現(xiàn)輸入矩形的一個(gè)角點(diǎn): 的提示,輸入(100,80),程序切換到VisualLISP的文本編輯窗口。光標(biāo)停在(getpoint 輸入
12、矩形的一個(gè)角點(diǎn):)之后,仍然亮顯該表達(dá)式。注意,指示按鈕內(nèi)的 I 在 () 之后。,單擊按鈕 ,光標(biāo)停在(getdist p1 輸入矩形的寬:)之前,并亮顯該表達(dá)式。注意,指示按鈕內(nèi)的I回到()之前。監(jiān)視窗口內(nèi)的變量p1=100.0 80.0 0.0。重復(fù)類似的操作,在AutoCAD窗口輸入矩形的寬度為200、高度為150,旋轉(zhuǎn)角為30。在操作過(guò)程中指示按鈕隨時(shí)顯示著光標(biāo)相對(duì)于表達(dá)式的位置,監(jiān)視窗口顯示著這些變量的當(dāng)前值(注意,alf的單位為弧度)。也說(shuō)明單擊按鈕 只執(zhí)行了一步表達(dá)式求值。 當(dāng)光標(biāo)停在(setq p3(polar p2 (+ alf (* 0.5 pi) h)之前時(shí),單擊按鈕
13、,整個(gè)程序被加亮顯示,光標(biāo)停在整個(gè)程序的結(jié)尾,再單擊以上任一按鈕,程序運(yùn)行結(jié)束。 切換到AutoCAD窗口,顯示著剛才繪制的矩形。,假定程序的第5行誤寫為 (getangl p1 輸入矩形的旋轉(zhuǎn)角: ),仍舊用上述的方法調(diào)試該程序,當(dāng)執(zhí)行到輸入矩形的旋轉(zhuǎn)角: 時(shí),將出現(xiàn)提示; error: no function definition: GETANGL(沒(méi)有GETANGL這個(gè)函數(shù)定義) 。點(diǎn)取查找按鈕 ,在隨后彈出的 FIND 對(duì)話框的FindWhat編輯框輸入查找內(nèi)容為 GETANGL,單擊 Find按鈕,找到getangl并改正為getangle。 重新調(diào)試程序,直至程序正常運(yùn)行。,2.
14、自動(dòng)分步調(diào)試程序 (1)自動(dòng)分步調(diào)試程序的步驟 將例6-1源代碼的文件裝入文本編輯窗口。監(jiān)視變量w、h、alf、p1、p2、p3、p4。加載該程序。選擇菜單DebugAnimate。 在AutoCAD的Command:提示下,鍵入rect3命令。Visua lLISP自動(dòng)切換到文本編輯窗口。隨著光標(biāo)的位置、指示按鈕 內(nèi)I和()的變化,自動(dòng)地執(zhí)行每一個(gè)表達(dá)式的求值,監(jiān)視窗口內(nèi)的變量值也相應(yīng)地改變。如果遇到了錯(cuò)誤的函數(shù)調(diào)用,程序停止運(yùn)行,并報(bào)告; error: no function definition: 信息。找到并改正錯(cuò)誤的函數(shù)。繼續(xù)調(diào)試程序,直至程序正常運(yùn)行。,(2)設(shè)置每步延遲的時(shí)間 選
15、擇菜單ToolsEnvironmant OptionsGeneral Options 彈出圖6-7所示General Options對(duì)話框。單擊該對(duì)話框的Diagnostic(診斷)卡,在Animation delay編輯框輸入每步延遲的時(shí)間(以毫秒為單位),單擊確定按鈕即可。,圖6-7診斷選項(xiàng)卡,6.4 斷點(diǎn)循環(huán) 表達(dá)式是AutoLISP程序的基本單元,LISP的工作實(shí)際上是不斷地對(duì)表達(dá)式進(jìn)行讀入、求值和輸出操作,在LISP術(shù)語(yǔ)中,被稱為讀算寫循環(huán)。 如果不用調(diào)試工具而是正常地運(yùn)行AutoLISP程序時(shí),程序?qū)⑻幱陧攲拥淖x算寫循環(huán)。如果在VisualLISP控制臺(tái)窗口內(nèi)對(duì)表達(dá)式求值時(shí),也是處
16、于頂層的讀算寫循環(huán)。 如果程序在運(yùn)行時(shí)被中斷或掛起,VisualLISP將控制轉(zhuǎn)交給控制臺(tái),就進(jìn)入了斷點(diǎn)循環(huán)(Break loop)。斷點(diǎn)循環(huán)是一個(gè)單獨(dú)的讀算寫循環(huán),它嵌套在原有的讀算寫循環(huán)內(nèi)。斷點(diǎn)循環(huán)也可以被中斷,這時(shí)將開(kāi)始一個(gè)嵌套于該斷點(diǎn)循環(huán)內(nèi)的讀算寫循環(huán)。斷點(diǎn)循環(huán)相對(duì)于頂層循環(huán)嵌套的層數(shù)稱為該中斷的層數(shù)。,進(jìn)入斷點(diǎn)循環(huán)時(shí),VisualLISP將在控制臺(tái)提示_$前加一個(gè)數(shù)字來(lái)指出所處循環(huán)的層數(shù)。例如,當(dāng)首次進(jìn)入程序的斷點(diǎn)循環(huán)時(shí),提示為_(kāi)1_$。如果處于斷點(diǎn)循環(huán)狀態(tài),就不能將控制切換到AutoCAD窗口。 從斷點(diǎn)循環(huán)退出,將恢復(fù)上一層循環(huán)。如果在該斷點(diǎn)循環(huán)中修改了某變量的值,程序繼續(xù)運(yùn)行時(shí)將
17、使用變量修改后的值。 斷點(diǎn)循環(huán)分為可繼續(xù)斷點(diǎn)循環(huán)和不可繼續(xù)斷點(diǎn)循環(huán)。,1. 可繼續(xù)的斷點(diǎn)循環(huán) 可繼續(xù)的斷點(diǎn)循環(huán)是指可以在程序中斷處,繼續(xù)向下執(zhí)行剩余的表達(dá)式。用以下方法進(jìn)入可繼續(xù)斷點(diǎn)循環(huán): (1)打開(kāi)Stop Once模式,碰到帶調(diào)試信息的表達(dá)式時(shí)。 (2)遇到帶Debug on Entry(進(jìn)入時(shí)調(diào)試)標(biāo)志的函數(shù)時(shí)。 (3)遇到程序中設(shè)置的斷點(diǎn)時(shí)。 (4)單擊暫停按鈕進(jìn)入斷點(diǎn)循環(huán)時(shí)。 (5)在前一個(gè)斷點(diǎn)循環(huán)狀態(tài)下,執(zhí)行Step Into、Step Over或Step Out時(shí)。 如果程序在某函數(shù)中被中斷,可以訪問(wèn)被該函數(shù)聲明的局部變量,甚至可以在控制臺(tái)提示下用setq函數(shù)修改它們的值。,2.
18、 不可繼續(xù)的斷點(diǎn)循環(huán) 當(dāng)程序出現(xiàn)錯(cuò)誤導(dǎo)致崩潰時(shí),如果設(shè)置了Break On Error選項(xiàng),將激活一個(gè)不可繼續(xù)的斷點(diǎn)循環(huán)。此時(shí)可以訪問(wèn)出錯(cuò)環(huán)境中的所有變量,但不能繼續(xù)執(zhí)行程序或執(zhí)行任何單步調(diào)試程序的命令。 如果工具欄上的單步調(diào)試的按鈕 、 、 或繼續(xù)運(yùn)行的按鈕 處于可用狀態(tài),說(shuō)明此時(shí)進(jìn)入了可繼續(xù)的斷點(diǎn)循環(huán)。 處于不可繼續(xù)的斷點(diǎn)循環(huán)時(shí),選取Debug菜單的Reset to Top Level項(xiàng)或單擊按鈕 ,退出斷點(diǎn)循環(huán)并跳轉(zhuǎn)至控制臺(tái)頂層循環(huán);選取Debug菜單的Quit Current項(xiàng)或單擊按鈕 ,退出斷點(diǎn)循環(huán)并返回到上一層循環(huán)。,6.5 利用斷點(diǎn)調(diào)試程序 運(yùn)行的程序遇到斷點(diǎn)時(shí),將產(chǎn)生一個(gè)中斷
19、。當(dāng)程序中斷時(shí),可查看、分析變量的值,修改程序的源代碼。利用斷點(diǎn)可提高調(diào)試程序的效率。 1. 有關(guān)斷點(diǎn)的操作 (1)在程序中設(shè)置/刪除斷點(diǎn) 只能在VisualLISP的文本編輯器窗口內(nèi)設(shè)置斷點(diǎn)。斷點(diǎn)應(yīng)位于表達(dá)式的左、右括號(hào)上。設(shè)置斷點(diǎn)的步驟如下: 將光標(biāo)移到需要程序暫停的位置。例如,需要在某表達(dá)式 之前暫停,則應(yīng)將光標(biāo)移至與表達(dá)式的左括號(hào)相鄰的位置。, 選擇菜單DebugToggle Breakpoint、單擊按鈕 或按F9鍵。如果該位置沒(méi)有斷點(diǎn),就加入一個(gè)斷點(diǎn),否則,刪除該斷點(diǎn)。單擊鼠標(biāo)右鍵在快捷菜單中選擇Toggle Breakpoint項(xiàng)也可以設(shè)置或刪除斷點(diǎn)。如果光標(biāo)不與括號(hào)相鄰,Vis
20、ual LISP暫時(shí)將光標(biāo)移到后面最近的右括號(hào)處,并通過(guò)對(duì)話框詢問(wèn)用戶是否在該處設(shè)置斷點(diǎn)。 選擇菜單DebugClear All Breakpoints項(xiàng),刪除已設(shè)置的所有斷點(diǎn)。,(2)改變斷點(diǎn)的顏色 VisualLISP用高亮矩形顯示每一個(gè)斷點(diǎn),默認(rèn)情況下,活動(dòng)的斷點(diǎn)是紅色的。選擇菜單ToolsWindow AttributesConfigure Current ,通過(guò)隨后彈出的Window Attributes對(duì)話框內(nèi)的WINDOW-TEXT下拉列表的:BPT-ACTIVE項(xiàng)可改變斷點(diǎn)的顏色。 (3)臨時(shí)禁用斷點(diǎn) 斷點(diǎn)可以被臨時(shí)禁用和恢復(fù)使用。禁用斷點(diǎn)的步驟如下: 將光標(biāo)置于斷點(diǎn)處并單擊鼠
21、標(biāo)右鍵。 從顯示的快捷菜單上選擇Breakpoints service項(xiàng),將彈出圖6-8所示斷點(diǎn)服務(wù)對(duì)話框。,圖6-8斷點(diǎn)服務(wù)對(duì)話框, 在斷點(diǎn)服務(wù)對(duì)話框中單擊Disable按鈕可臨時(shí)禁用該斷點(diǎn);若該斷點(diǎn)已被禁用,圖6-9所示斷點(diǎn)服務(wù)對(duì)話框?qū)⒊霈F(xiàn)Enable按鈕,單擊該按鈕,所選斷點(diǎn)將改變?yōu)榭捎脿顟B(tài)。 默認(rèn)情況下,被禁用的斷點(diǎn)顯示為藍(lán)色。用設(shè)置斷點(diǎn)顏色的方法也可以改變被禁用斷點(diǎn)的顏色。 (4)瀏覽和編輯程序中的斷點(diǎn) 選擇菜單ViewBreakpoints Window將看到圖6-9所示的斷點(diǎn)對(duì)話框。,圖6-9斷點(diǎn)對(duì)話框,該斷點(diǎn)窗口列出了所有編輯器窗口的斷點(diǎn)。其中有程序6-1.lsp的3個(gè)斷點(diǎn)、
22、6-2.lsp的2個(gè)斷點(diǎn)。每項(xiàng)包含斷點(diǎn)的源文件名以及斷點(diǎn)在源文件中的位置,位置是以0開(kāi)始的西文字符數(shù)量,前面的+號(hào)表示該斷點(diǎn)是活動(dòng)的,- 號(hào)表示該斷點(diǎn)是被禁用的。 單擊該對(duì)話框的Delete all按鈕可以刪除所有的斷點(diǎn);亮顯一項(xiàng),單擊Show按鈕可顯示該斷點(diǎn)所在的源文件及其在源文件中的位置;單擊Delete按鈕可刪除該斷點(diǎn);單擊Edit按鈕可打開(kāi)圖6-9所示的斷點(diǎn)服務(wù)對(duì)話框,利用該對(duì)話框可以改變斷點(diǎn)可用或禁用的狀態(tài)。 (5) 斷點(diǎn)的生命周期 可以在加載程序之前或之后設(shè)置斷點(diǎn)。如果在加載程序之后設(shè)置斷點(diǎn),該斷點(diǎn)只有在重新加載程序之后才有效。,2. 在斷點(diǎn)處繼續(xù)運(yùn)行程序 運(yùn)行的程序遇到斷點(diǎn)時(shí),將
23、產(chǎn)生一個(gè)中斷,即斷點(diǎn)循環(huán)。單擊分布調(diào)試按鈕 、 和 可繼續(xù)運(yùn)行程序。如果在復(fù)雜的表達(dá)式之內(nèi)還有一些斷點(diǎn),單擊按鈕 和 ,首先在斷點(diǎn)處暫停。此外還有以下控制程序繼續(xù)運(yùn)行的工具欄按鈕、快捷鍵或Debug菜單的菜單項(xiàng)。 Continue或Ctrl+F8:繼續(xù)執(zhí)行程序直至遇到下一個(gè)斷點(diǎn)(如果有)或程序結(jié)束。 Quit Current或Ctrl+Q:結(jié)束當(dāng)前程序,返回到控制臺(tái)的上一層斷點(diǎn)循環(huán)。 Reset to Top Level或Ctrl+R:結(jié)束當(dāng)前程序,結(jié)束所有的斷點(diǎn)循環(huán)。,3. 利用斷點(diǎn)調(diào)試程序?qū)嵗?【例6-2】 定義繪制圖6-10所示圖形的命令,p0、d、b、t1、alf是交互輸入的參數(shù)。,圖
24、6-10軸的鍵槽部位截面,程序源代碼如下: (defun c:tuxing (/ p0 alf d b t1 r l b1 sit p1 p2 p3 p4 p5) (setq p0 (getpoint nEnter P0: ) (setq d (getdist p0 nEnter d: ),(setq b (getdist p0 nEnter b: ) (setq tl (getdist p0 nEnter t1: ) ;tl應(yīng)改為t1 (setq alf (getangle p0 nEnter alf: ) ;斷點(diǎn)1的位置 (setq r (* 0.5 d) bl (* 0.5 b) (se
25、tq l (sqrt (- (* r r) (* b1 b1) (setq sit (tan b1 l) ;tan應(yīng)改為atan (setq p1 (polar p0 (+ alf sit) r) (setq p2 (polar p0 (+ pi alf) r) (setq p3 (polar p0 (- alf sit) r) (setq p4 (polar p3 (+ pi alf) (- (+ r l) t1) (setq p5 (polar p1 (+ alf pi) (- (+ r l) t1) (command pline p1 a s p2 p3 l p4 p5 c) ),選擇菜
26、單FileOpen File將例6-2所示源代碼的文件裝入文本編輯窗口。選擇菜單DebugAdd Watch或單擊按鈕 ,監(jiān)視變量p0、d、b、t1、alf、r、l、b1、sit、p1、p2、p3、p4、p5。 加載該程序,單擊按鈕 ,在AutoCAD的Command:提示下鍵入TUXING命令,程序停止運(yùn)行,出現(xiàn)提示;error: bad argument type: numberp: nil(錯(cuò)誤的參數(shù)類型,出現(xiàn)了無(wú)定義的參數(shù)) 。 將光標(biāo)移至程序的第6行末尾,選擇菜單DebugToggle Breakpoint、按功能鍵F9或單擊按鈕 ,在該處設(shè)置一個(gè)斷點(diǎn)。,單擊按鈕 ,加載當(dāng)前文本編輯
27、窗口內(nèi)的源程序。單擊按鈕 ,在Command:提示下鍵入TUXING命令,依次輸入p0、d、b、t1、alf的值之后,回到文本編輯窗口。光標(biāo)停留在斷點(diǎn)1的位置,說(shuō)明已執(zhí)行了5個(gè)get表達(dá)式。 瀏覽監(jiān)視窗口,p0、d、b、alf已有具體的數(shù)值,而T1=nil,說(shuō)明表達(dá)式(setq tl (getdist p0 nEnter t1: ))有錯(cuò)誤,仔細(xì)檢查,發(fā)現(xiàn)誤將t1寫為tl。改正之后,單擊按鈕 ,單擊按鈕 ,在Command:提示下鍵入TUXING命令,依次輸入p0等的數(shù)據(jù),當(dāng)程序停留在斷點(diǎn)1的位置時(shí),瀏覽監(jiān)視窗口t1已有定義了。,單擊繼續(xù)按鈕 ,程序停止運(yùn)行,出現(xiàn)提示; error: no f
28、unction definition: TAN(錯(cuò)誤,沒(méi)有定義函數(shù):TAN),正確的函數(shù)應(yīng)該是蘭色的,找到黑色的函數(shù)名tan,改正為atan。 將光標(biāo)移至斷點(diǎn)1處單擊按鈕 ,刪除斷點(diǎn)1。單擊按鈕 ,在 Command:提示下鍵入TUXING命令,依次 輸入p0等的數(shù)據(jù),程序正常結(jié)束,并得到 圖6-10所示圖形。,圖6-10,在此例中,在斷點(diǎn)1暫停時(shí),調(diào)試按鈕從 到 都處于可用狀態(tài),因?yàn)榇藭r(shí)處于可繼續(xù)的斷點(diǎn)循環(huán)。 如果運(yùn)行該程序前,選擇菜單DebugBreak On Error,執(zhí)行到tan函數(shù)時(shí),因出現(xiàn)了無(wú)定義的函數(shù)而程序崩潰,但在該處產(chǎn)生了一個(gè)不可繼續(xù)的斷點(diǎn)循環(huán)。此時(shí)只有調(diào)試按鈕 和 是可用
29、的。用戶只能選擇退到上一層斷點(diǎn)循環(huán)還是退到頂層斷點(diǎn)循環(huán)。 如果在Command:提示下,鍵入TUXING命令,在要求用戶輸入數(shù)據(jù)時(shí),按下Esc鍵,程序停止運(yùn)行,此時(shí)也產(chǎn)生了一個(gè)不可繼續(xù)的斷點(diǎn)循環(huán)。,6.6 跟蹤程序運(yùn)行 跟蹤程序運(yùn)行的工具有命令跟蹤、出錯(cuò)跟蹤和跟蹤堆棧。 1. 命令跟蹤 如果打開(kāi)命令跟蹤模式,VisualLISP將在窗口跟蹤有關(guān)AutoCAD命令的執(zhí)行情況,以便監(jiān)控程序是否在執(zhí)行AutoCAD命令時(shí)出現(xiàn)了問(wèn)題。 例如,選擇菜單DebugTrace Command,在Command:提示下,鍵入TUXING命令(假定程序能夠正常運(yùn)行),將在圖6-11所示Trace窗口顯示有關(guān)Au
30、toCAD命令的執(zhí)行情況的信息。,圖6-11顯示有關(guān)AutoCAD命令的執(zhí)行情況的跟蹤窗口,2. 出錯(cuò)跟蹤 出錯(cuò)跟蹤是用Error Trace窗口錄跟蹤程序運(yùn)行的結(jié)果。在跟蹤窗口按鼠標(biāo)右鍵,將彈出跟蹤窗口的快捷菜單,見(jiàn)圖6-13。 下面以例6-3為例,介紹利用Error Trace窗口調(diào)試程序的方法。 【例6-3】定義求解一元二次方程的函數(shù) 一元二次方程的表達(dá)式為: 如果 a=0,它不是一個(gè)二次方程;如果,方程有實(shí)數(shù)解,否則無(wú)解。方程的求根公式為:,程序內(nèi)容如下: (defun roots(a b c / t1 t2 x1 x2) ;t1、t2、x1、x2是局部變量 (if (/= a 0)
31、(progn,(setq t1 (- (* b b) (* 4 a c) ; (if (= t1 0.0) (progn (setq t2 (sqrt t1) ; (setq x1 (/ (+ -b t2) (* 2 a) ;此處有錯(cuò) (setq x2 (/ (- -b t2) (* 2 a) ;此處有錯(cuò) (print (list x1 x2) ) (print n根是復(fù)數(shù).) ) ) (print n不是一個(gè)二次方程.) ) (princ);靜默退出 ),選擇菜單FileOpen File將例6-3所示源代碼的文件裝入文本編輯窗口。單擊工具欄按鈕 。在Visual LISP Console(
32、控制臺(tái))窗口的_$提示下鍵入(ROOTS 1 5 6)。顯示了出錯(cuò)原因是錯(cuò)誤的參數(shù)類型,見(jiàn)圖6-12。,圖6-12顯示出運(yùn)行錯(cuò)誤的控制臺(tái)窗口,選擇菜單ViewError Trace或Ctrl+Shift+R。將出現(xiàn)圖6-13所示的出錯(cuò)跟蹤窗口。,圖6-13 出錯(cuò)跟蹤窗口及其快捷菜單,出錯(cuò)跟蹤窗口的第1行為:ERROR BREAK,表示因出錯(cuò)產(chǎn)生了一個(gè)中斷。第2行為2+ nil 1.0,記錄了中斷的原因是1.0與一個(gè)無(wú)定義的參數(shù)求和。亮顯第2行,按鼠標(biāo)右鍵,彈出圖6-14所示的快捷菜單。選取快捷菜單的Call point source,與該錯(cuò)相關(guān)的表達(dá)式(+ -b t2)被加亮顯示。單擊添加監(jiān)視
33、按鈕,監(jiān)視-b的值,在監(jiān)視窗口看到-b的值為nil。原因是-b不是b的相反數(shù),而是另一個(gè)尚未定義的變量。應(yīng)改正為(- t2 b)。 同樣的過(guò)程可發(fā)現(xiàn)下一行的(- -b t2)有相同性質(zhì)的錯(cuò)誤,應(yīng)改為(- 0 b t2)。 運(yùn)行改正后的程序,結(jié)果為(3.0 2.0)。,3. 跟蹤堆棧 跟蹤堆棧保存著調(diào)用函數(shù)的歷史記錄。利用堆棧后進(jìn)先出的特點(diǎn),記錄一系列的嵌套表達(dá)式的出口。當(dāng)程序運(yùn)行中斷,如遇到斷點(diǎn),通過(guò)跟蹤堆??梢粤私獬绦虻倪\(yùn)行狀態(tài)。如果程序運(yùn)行出現(xiàn)錯(cuò)誤,導(dǎo)致程序崩潰,通過(guò)跟蹤堆??梢苑治龀绦虮罎⒌脑?。 首先通過(guò)以下實(shí)例了解跟蹤堆棧。將例6-4所示程序代碼復(fù)制到VisualLISP文本編輯器窗
34、口,在程序的第6行的右括號(hào)處設(shè)置斷點(diǎn)。 【例6-4】了解跟蹤堆棧的結(jié)構(gòu) 程序說(shuō)明:stack-tracing是一個(gè)遞歸調(diào)用的,indexval是序號(hào)的初始值,maxval是序號(hào)的最大值。當(dāng)indexval小于maxval時(shí),打印indexval的值。st5是調(diào)用stack-tracing的主函數(shù)。,(defun stack-tracing (indexval maxval) (princ n遞歸函數(shù)實(shí)參 = ) (princ indexval) (if ( indexval maxval) (stack-tracing (1+ indexval) maxval) (princ n遞歸結(jié)束。)
35、;在這里設(shè)置一個(gè)斷點(diǎn) ) 單擊按鈕 ,在控制臺(tái)窗口鍵入(stack-tracing 1 5)運(yùn)行該程序。當(dāng)程序運(yùn)行到斷點(diǎn)暫停時(shí),單擊按鈕 ,將彈出圖6-14所示跟蹤堆棧窗口。通過(guò)該跟蹤堆棧窗口了解該程序的運(yùn)行狀態(tài)。,圖6-14跟蹤堆棧窗口,(1)跟蹤堆棧窗口的結(jié)構(gòu) 按鈕 用于刷新跟蹤堆棧窗口,按鈕 用于將跟蹤堆棧窗口中的內(nèi)容復(fù)制到跟蹤窗口或日志文件。 每個(gè)堆棧元素占一行。每一行的前面都有一個(gè)用或括起的數(shù)字,數(shù)字表示該元素在跟蹤堆棧的序號(hào)。,(2)堆棧元素的種類 堆棧元素可分為:函數(shù)調(diào)用框架、跟蹤堆棧最頂端和最底端關(guān)鍵字的框架、頂端結(jié)構(gòu)、Lambda結(jié)構(gòu)和特殊結(jié)構(gòu)五種類型。 函數(shù)調(diào)用框架。表示單
36、個(gè)函數(shù)調(diào)用。其格式如下: 序號(hào) 函數(shù)名 參數(shù) . 圖6-14所示跟蹤堆棧窗口的26行顯示了調(diào)用stack-tracing函數(shù)時(shí)的函數(shù)調(diào)用框架。例如: 2(STACK-TRACING 5 5) 2表示它是堆棧元素列表的第二個(gè)元素,STACK-TRACING是函數(shù)名,其后的兩個(gè)數(shù)字是傳給該函數(shù)的實(shí)際參數(shù)值。 跟蹤堆棧最頂端和最底端的關(guān)鍵字框架。其格式如下: : 關(guān)鍵字框架類型 與程序狀態(tài)相關(guān)的其他信息 關(guān)鍵字框架代表VisualLISP環(huán)境中的一種特定的操作,關(guān)鍵字指明操作的類型。關(guān)鍵字框架只可能出現(xiàn)在堆棧的頂端或底端。,框架類型 發(fā)生的操作 :ACAD-REQUEST 由 AutoCAD 命令行
37、調(diào)用的函數(shù)。 :DCL-ACTION 由AutoCAD要求執(zhí)行對(duì)話框控件的動(dòng)作。關(guān)鍵字 :DCL-ACTION后的 兩個(gè)字符串分別是控件名和控件值。如果出現(xiàn)的是一個(gè)數(shù),則是對(duì) 話框回調(diào)函數(shù)的值。 :INSPECT-EVAL 執(zhí)行了檢驗(yàn)功能。 :INSPECT-VERBOSE 進(jìn)入了圖形檢驗(yàn)器的入口函數(shù)。 :TOP-COMMAND VisualLISP交互環(huán)境的動(dòng)作。例如,加載文件或選取文本時(shí)直接運(yùn) 行一個(gè)函數(shù)。 :USER-INPUT 框架內(nèi)的字符串是在控制臺(tái)輸入的。 :WATCH-EVAL 執(zhí)行了監(jiān)視功能。,表6-1所示的關(guān)鍵字框架只能出現(xiàn)在堆棧的底端。,表6-1 底端關(guān)鍵字框架,圖6-14
38、所示跟蹤堆棧窗口的第8行顯示了本例堆棧底端關(guān)鍵字框架的信息。內(nèi)容如下: :USER-INPUT (stack-tracing 1 5) 表示是用戶在控制臺(tái)輸入了(stack-tracing 1 5)。,表6-2所示的關(guān)鍵字框架只能出現(xiàn)在堆棧頂端。,框架類型發(fā)生的操作 :ACMD-CALLBACK調(diào)用了已注冊(cè)的AutoCAD命令。 :AFTER-EXP程序正處于調(diào)試中斷模式,且剛用Step Into或Step Over選項(xiàng)步出某表達(dá)式。 :ARQ-SUBR-CALLBACK表示從AutoCAD窗口調(diào)用標(biāo)準(zhǔn)的VisualLISP定義的函數(shù)。 :AXVLO-IO-CALLBACK :DWF或:DWG
39、在DWG或DWF文件保存或恢復(fù)VLA對(duì)象。 :BEFORE-EXP進(jìn)入函數(shù)時(shí)用調(diào)試器中斷了程序。當(dāng)用戶用Step Into 或Step Over命令步入某表達(dá)式 時(shí)會(huì)出現(xiàn)該消息。 :BREAK-POINT用戶指定的斷點(diǎn)。 :ENTRY-NAMESPACE一個(gè)獨(dú)立VLX命名空間上下文中的調(diào)用。 :ERROR-BREAK一般的運(yùn)行時(shí)錯(cuò)誤。單擊鼠標(biāo)右鍵,選擇菜單中的Show Message菜單項(xiàng),可以查看更 詳細(xì)的出錯(cuò)信息。 :FUNCTION-ENTRY在進(jìn)入函數(shù)時(shí)調(diào)試器中斷了程序。該消息后的下一個(gè)堆棧元素包含了引發(fā)中斷的函數(shù) 的調(diào)用框架。 :KBD-BREAK按下了Pause鍵,程序被掛起。 :
40、PROTECT-ASSIGN為受保護(hù)的符號(hào)賦值。單擊鼠標(biāo)右鍵,選擇菜單中的Show Message菜單項(xiàng),查看變量 名、變量當(dāng)前值和試圖賦給該變量的新值。也可以選擇Inspect項(xiàng),查看包含該符號(hào)的 表,以及跟隨在 :PROTECT-ASSIGN 之后的新值。 :REACTOR-CALLBACK調(diào)用了反應(yīng)器。 :READ-ERROR在讀操作時(shí)發(fā)生的錯(cuò)誤。單擊鼠標(biāo)右鍵,選擇菜單中的Show Message菜單項(xiàng),可獲得 更詳細(xì)的出錯(cuò)信息。 :SYNTAX-ERROR遇到了AutoLISP語(yǔ)法錯(cuò)誤。,表6-2頂端關(guān)鍵字框架表6-2頂端關(guān)鍵字框架,圖6-14所示跟蹤堆棧窗口的第1行顯示了本例堆棧頂端
41、關(guān)鍵字框架的信息。內(nèi)容如下: : BREAK-POINT 表示程序運(yùn)行的最后一個(gè)操作是遇到用戶設(shè)置的斷點(diǎn)。 頂端結(jié)構(gòu)。它說(shuō)明相應(yīng)動(dòng)作是由頂層控制臺(tái)窗口中輸入的表達(dá)式引起,或在VisualLISP文本編輯器窗口中加載文件或所選文本時(shí)觸發(fā)的函數(shù)調(diào)用引起的。 Lambda 結(jié)構(gòu)。當(dāng)程序調(diào)用lambda函數(shù)時(shí),VisualLISP 會(huì)在堆棧中放入該結(jié)構(gòu)。 特殊結(jié)構(gòu)。調(diào)用foreach和repeat函數(shù)時(shí),VisualLISP 在堆棧中加入該結(jié)構(gòu),該結(jié)構(gòu)中不顯示函數(shù)的參數(shù),其格式如下: FOREACH或REPEAT lFOREACH 框架表示對(duì)foreach函數(shù)的調(diào)用。例如,對(duì)以下表達(dá)式求值: (for
42、each n (a b c) (print n);在表達(dá)式開(kāi)始處設(shè)置斷點(diǎn) 單步運(yùn)行該表達(dá)式,當(dāng)執(zhí)行到(print n)時(shí),選擇菜單ViewTrace stack項(xiàng),將彈出圖6-15所示跟蹤堆棧窗口。,圖6-15調(diào)用foreach函數(shù)時(shí)的跟蹤堆棧窗口,該窗口的第一行為:AFTER-EXP,其中1是該元素的序號(hào),從表6-2所示頂端關(guān)鍵字框架表中可看到,AFTER-EXP表示程序正處于調(diào)試中斷模式,且剛用Step Into或Step Over選項(xiàng)步出某表達(dá)式。 該窗口的第二行為2FOREACH,其中2是該元素的序號(hào),F(xiàn)OREACH是該函數(shù)的形式。 lREPEAT 框架表示對(duì)repeat 函數(shù)的調(diào)用。
43、例如,對(duì)以下表達(dá)式求值: (setq i 0) (repeat 10 (princ (1+ i) ),單步運(yùn)行該表達(dá)式,執(zhí)行到(1+ i)時(shí),選擇菜單ViewTrace stack項(xiàng),將彈出圖6-16所示跟蹤堆棧窗口。,圖6-16調(diào)用repeat函數(shù)時(shí)的跟蹤堆棧窗口,if、cond和setq 等函數(shù)并不出現(xiàn)在跟蹤堆棧里,因?yàn)樵谠次募腣isualLISP文本編輯器窗口可以看到它們被調(diào)用的位置。,根據(jù)圖6-14所示跟蹤堆棧窗口,可以看出stack-tracing從調(diào)用到中斷的過(guò)程如下: 第8行::USER-INPUT (stack-tracing 1 5) 用戶在控制臺(tái)輸入了(stack-tra
44、cing 1 5),調(diào)用了該函數(shù)。,圖6-14跟蹤堆棧窗口,第7行:7(USUBR034086e0-top-) 該函數(shù)的地址。 第6行:6(stack-tracing 1 5) indexval等于1,maxval等于5調(diào)用該函數(shù)。 第5行:5(stack-tracing 2 5) indexval等于2,maxval等于5調(diào)用該函數(shù)。 第4行:4(stack-tracing 3 5) indexval等于3,maxval等于5調(diào)用該函數(shù)。 第3行:3(stack-tracing 4 5) indexval等于4,maxval等于5調(diào)用該函數(shù)。 第2行:2(stack-tracing 5 5)
45、 indexval等于5,maxval等于5調(diào)用該函數(shù)。 第1行:: BREAK-POINT 遇到用戶設(shè)置的斷點(diǎn)暫停,6.7 修改變量和函數(shù)的特性 1. 符號(hào)服務(wù)對(duì)話框的功能 符號(hào)可以是變量或函數(shù)名。通過(guò)符號(hào)服務(wù)對(duì)話框可以查看或修改變量的當(dāng)前值,可以設(shè)置變量或函數(shù)的一些特性。 2. 符號(hào)服務(wù)對(duì)話框的組成,圖6-17符號(hào)服務(wù)對(duì)話框,圖6-17所示為符號(hào)服務(wù)對(duì)話框,它由工具欄、符號(hào)名、符號(hào)值和符號(hào)標(biāo)志四部分組成。 (1)工具欄:工具欄提供了對(duì)符號(hào)操作的工具。它包括以下四個(gè)圖像按鈕: 將當(dāng)前符號(hào)加入到監(jiān)視窗口。 檢驗(yàn)該符號(hào)的值。 如果該符號(hào)是用戶定義的函數(shù)名,則打開(kāi)包含該函數(shù)定義的文本編輯器窗口,并
46、亮顯該函數(shù)的定義。 如果該符號(hào)是一個(gè)內(nèi)部函數(shù)名,則顯示VisualLISP幫助文件中的相關(guān)信息。 (2)Name編輯框:顯示被操作的符號(hào)名。 (3)Value編輯框:顯示符號(hào)值或它最初的子串。,(4)Flags組:該組有以下四個(gè)切換開(kāi)關(guān),其特性如下: Trace切換開(kāi)關(guān):對(duì)設(shè)置為Trace標(biāo)志的函數(shù),在Trace窗口顯示對(duì)其跟蹤的信息。該標(biāo)志只對(duì)作為函數(shù)名的符號(hào)有效。 Protect Assign切換開(kāi)關(guān):該標(biāo)志的符號(hào)受到保護(hù)。程序運(yùn)行時(shí)如果對(duì)受到保護(hù)的符號(hào)賦值,將產(chǎn)生詢問(wèn)信息。受到保護(hù)的符號(hào)在文本編輯窗口呈藍(lán)色顯示。在默認(rèn)情況下,所有AutoLISP內(nèi)置函數(shù)的函數(shù)名都受到保護(hù)。例如,符號(hào)pi
47、、setq就是受到保護(hù)的符號(hào)。 Debug on Entry切換開(kāi)關(guān):如果設(shè)置了該標(biāo)志,不管是否加載了該函數(shù)的調(diào)試信息,在每次調(diào)用該函數(shù)時(shí)都會(huì)產(chǎn)生中斷。該標(biāo)志只對(duì)用戶定義的函數(shù)起作用。 Export to AutoCAD切換開(kāi)關(guān):如果設(shè)置了該標(biāo)志,那么與該符號(hào)相關(guān)聯(lián)的函數(shù)會(huì)被定義為外部函數(shù),這樣的函數(shù)可以被ObjectARX應(yīng)用程序調(diào)用。,3. 打開(kāi)符號(hào)服務(wù)對(duì)話框 有兩種打開(kāi)符號(hào)服務(wù)對(duì)話框的途徑 (1)在程序源代碼或控制臺(tái)窗口中亮顯所需符號(hào)名,然后選擇菜單ViewSymbol Service,或單擊Debug工具欄上的按鈕 。 (2)先選擇上述菜單或圖像按鈕 ,在隨后彈出的圖6-18所示的符號(hào)
48、服務(wù)對(duì)話框內(nèi)輸入符號(hào)名或在下拉列表中選取符號(hào)名,若光標(biāo)附近有符號(hào)名,則該符號(hào)名作為新符號(hào)名的缺省輸入。單擊OK按鈕即可打開(kāi)圖6-17所示的符號(hào)服務(wù)對(duì)話框。,圖6-18輸入符號(hào)名之前的符號(hào)服務(wù)對(duì)話框,4. 修改變量的值 假定某程序有以下兩行代碼: (setq a 1) ;此處設(shè)置一個(gè)斷點(diǎn) (princ a) 當(dāng)程序遇到斷點(diǎn)暫停時(shí),亮顯變量a,單擊按鈕 ,在隨后彈出的符號(hào)服務(wù)對(duì)話框的Value編輯框里顯示了變量a的當(dāng)前值為1。將該值修改為2,點(diǎn)取OK按鈕。單擊按鈕 ,將在控制臺(tái)將打印出變量a的結(jié)果為2。說(shuō)明完成了對(duì)變量a的修改。 如果是可繼續(xù)的斷點(diǎn)循環(huán),利用符號(hào)服務(wù)對(duì)話框的這一功能,可以直接改變變
49、量的值繼續(xù)運(yùn)行程序。,5. 設(shè)置符號(hào)的特性 假定有以下表達(dá)式: (setq a(+ b c)) ;可以是任一含有變量b的表達(dá)式 亮顯變量b,單擊按鈕 ,將隨后彈出的服務(wù)對(duì)話框的Flags組的Protect Assign切換開(kāi)關(guān)設(shè)置為開(kāi),單擊OK按鈕。變量b呈蘭色顯示,說(shuō)明它已成為受保護(hù)符號(hào)。在隨后的表達(dá)式中,如果直接或間接改變b的值,將出現(xiàn)圖6-19所示的提示。用是相應(yīng),程序在此處暫停;用否相應(yīng),符號(hào)b可以被改變。,圖6-19 詢問(wèn)是否為受保護(hù)符號(hào)賦值的對(duì)話框,解除符號(hào)保護(hù)狀態(tài)的操作與此類似,只是將Protect Assign切換開(kāi)關(guān)設(shè)置為關(guān)閉狀態(tài)。,6. 設(shè)置函數(shù)在被調(diào)用時(shí)處于暫停的狀態(tài) 將
50、例6-4所示程序代碼復(fù)制到VisualLISP文本編輯器窗口,刪除程序中的斷點(diǎn),亮顯函數(shù)名stack-tracing,點(diǎn)取按鈕 ,將隨后彈出的服務(wù)對(duì)話框的Flags組的Debug on Entry 切換開(kāi)關(guān)切換開(kāi)關(guān)設(shè)置為開(kāi),點(diǎn)取OK按鈕。然后運(yùn)行該程序。當(dāng)程序運(yùn)行遇到對(duì)stack-tracing函數(shù)的調(diào)用時(shí),不管事前是否在函數(shù)內(nèi)設(shè)置了斷點(diǎn),當(dāng)程序運(yùn)行到該函數(shù)時(shí),自動(dòng)處于暫停的狀態(tài)。此時(shí)可利用各種調(diào)試程序的工具查看、檢驗(yàn)或分析變量的結(jié)果。,6.8 檢驗(yàn)窗口 1. 檢驗(yàn)窗口的功能 檢驗(yàn)窗口的功能是瀏覽或檢驗(yàn)查數(shù)字、字符串、變量、表、AutoCAD的圖形元素、AutoCAD的選擇集等AutoLISP
51、和AutoCAD對(duì)象。使用檢驗(yàn)窗口還可以瀏覽復(fù)雜對(duì)象的數(shù)據(jù)結(jié)構(gòu)和瀏覽ActiveX對(duì)象。 2. 檢驗(yàn)窗口的結(jié)構(gòu),標(biāo)題欄 對(duì)象行 元素表,圖6-20檢驗(yàn)窗口的結(jié)構(gòu),驗(yàn)窗口的樣式見(jiàn)圖6-20。窗口的內(nèi)容與被操作對(duì)象的種類相關(guān)。所有的檢驗(yàn)窗口都有一個(gè)標(biāo)題欄、對(duì)象行和元素表(該表可能為空)。,(1)標(biāo)題欄:對(duì)話框的標(biāo)題,同時(shí)顯示所了解對(duì)象的類型。 (2)對(duì)象行:對(duì)象名或?qū)ο笾怠?(3)元素表:組成該對(duì)象的成員。對(duì)象種類不同,元素表的大小和內(nèi)容就有所不同。元素表的每一項(xiàng)(行)都分為名稱和內(nèi)容兩部分。名稱用括號(hào)括起,方括號(hào) 說(shuō)明可以通過(guò)與該項(xiàng)關(guān)聯(lián)的快捷菜單的修改選項(xiàng)修改該項(xiàng);而花括號(hào) 說(shuō)明用戶不能修改該項(xiàng)
52、。 對(duì)象欄和元素表都有與自己的關(guān)聯(lián)快捷菜單。 3. 打開(kāi)檢驗(yàn)窗口的步驟 選中某AutoLISP對(duì)象名(例如某變量) 從 VisualLISP選擇菜單ViewInspect,或單擊Debug工具欄按鈕 。 也可以通過(guò)快捷菜單選擇Inspect項(xiàng),或者選擇Symbol Service等窗口工具欄的按鈕 。 如果在調(diào)用檢驗(yàn)窗口之前沒(méi)有選中對(duì)象,VisualLISP將顯示圖6-21所示對(duì)話框,提示用戶輸入要檢驗(yàn)的對(duì)象。,圖6-21輸入檢驗(yàn)對(duì)象的對(duì)話框,VisualLISP保存用戶最近輸入檢驗(yàn)窗口的15個(gè)記錄??梢酝ㄟ^(guò)下拉列表選擇以前指定的檢驗(yàn)對(duì)象。 4. 各種對(duì)象的檢驗(yàn)窗口 檢驗(yàn)窗口元素表的內(nèi)容是由檢
53、驗(yàn)對(duì)象的類型確定的。, INT(整數(shù)) 對(duì)象欄是整數(shù)本身,元素表的內(nèi)容是用二進(jìn)制、八進(jìn)制、十進(jìn)制、十六進(jìn)制和字符形式顯示的數(shù)值。字符格式是指和該數(shù)相應(yīng)的ASCII字符,對(duì)大于256的整數(shù)取其與256的余數(shù)。, REAL(實(shí)數(shù)) 對(duì)象欄是實(shí)數(shù)本身,它沒(méi)有元素表。 STRING(字符串) 對(duì)象欄是字符串本身,它的元素表是該字符串的單字符 序列。雙擊某單字符可了解該字符的數(shù)字表示形式。 LIST (規(guī)則表) 規(guī)則表的檢驗(yàn)窗口見(jiàn)圖6-22 。元素表內(nèi)是該表的元素序列。 LIST(不規(guī)則表) 不規(guī)則表,也成為點(diǎn)對(duì)(dotted pairs)。元素表內(nèi)是該表的car和cdr操作的結(jié)果。例如,由 (cons 8 A) 創(chuàng)建的表,其檢驗(yàn)窗口如圖6-23所示。,圖6-22規(guī)則表 圖6-23不規(guī)則表, FILE(文件) 文件的檢驗(yàn)窗口見(jiàn)圖6-24。元素表內(nèi)是該文件的名字和打開(kāi)該文件時(shí)的屬性。name指出了文件名,mode指出該文件是打開(kāi)供讀、寫、附加,還是已被關(guān)閉,id是內(nèi)部的文件標(biāo)識(shí),position顯示了讀或?qū)懳募漠?dāng)前位置,eof指出是否在文件的結(jié)束處,如果文件是以寫模式打開(kāi)時(shí)不出現(xiàn)該項(xiàng)。 SUBR(函數(shù)) SUBR又分為SUBR和USUBR函數(shù)。 SUBR是內(nèi)部或已編譯的函數(shù),元素表內(nèi)是該函數(shù)的名字。內(nèi)部函數(shù)的檢驗(yàn)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030中國(guó)白葡萄酒行業(yè)市場(chǎng)深度分析及發(fā)展預(yù)測(cè)與投資策略報(bào)告
- 2025至2030中國(guó)電力濾波器行業(yè)發(fā)展研究與產(chǎn)業(yè)戰(zhàn)略規(guī)劃分析評(píng)估報(bào)告
- 2025至2030中國(guó)生姜油行業(yè)市場(chǎng)占有率及投資前景評(píng)估規(guī)劃報(bào)告
- 2025至2030中國(guó)玄武巖連續(xù)纖維行業(yè)產(chǎn)業(yè)運(yùn)行態(tài)勢(shì)及投資規(guī)劃深度研究報(bào)告
- 2025至2030中國(guó)物聯(lián)網(wǎng)專業(yè)服務(wù)行業(yè)產(chǎn)業(yè)運(yùn)行態(tài)勢(shì)及投資規(guī)劃深度研究報(bào)告
- 應(yīng)對(duì)叛逆期的教育與心理引導(dǎo)技巧探索
- 地質(zhì)專業(yè)培訓(xùn)課件
- 打造跨文化教育資源平臺(tái)促進(jìn)全球教育交流
- 學(xué)生自我認(rèn)知與教育心理學(xué)的關(guān)系探討
- 醫(yī)療健康領(lǐng)域中教師的科研方向與挑戰(zhàn)分析
- 教育政策學(xué)全套課件
- 2025至2030年中國(guó)高速公路廣告行業(yè)市場(chǎng)行情監(jiān)測(cè)及投資前景展望報(bào)告
- 識(shí)別心內(nèi)科護(hù)理高風(fēng)險(xiǎn)
- 2025年 嘉峪關(guān)市招聘編制外聘用制教師筆試試卷附答案
- 食品公司衛(wèi)生間管理制度
- 2025年數(shù)據(jù)挖掘和分析考試試卷及答案
- 口腔粘結(jié)系統(tǒng)
- 2025至2030年中國(guó)尼龍?jiān)偕闲袠I(yè)市場(chǎng)運(yùn)行格局及發(fā)展前景研判報(bào)告
- 焊工考試試題及答案下載
- 德克士的區(qū)域擴(kuò)張計(jì)劃
- 2025河南省豫地科技集團(tuán)社會(huì)招聘169人筆試參考題庫(kù)附帶答案詳解析集合
評(píng)論
0/150
提交評(píng)論