调试程序清华CAD二次开发LISP.ppt
《调试程序清华CAD二次开发LISP.ppt》由会员分享,可在线阅读,更多相关《调试程序清华CAD二次开发LISP.ppt(72页珍藏版)》请在三一办公上搜索。
1、第 6 章 调试程序,6.1 概述 语法正确的程序并不能保证正常运行,在运行时可能会产生错误的结果或者发生崩溃现象,这就需要调试。调试程序的步骤是:控制程序在指定的位置暂停;查看、分析有关变量的值;修改程序的源代码;继续或重新运行程序;如果程序不能正常运行,继续调试程序,直至程序正常运行。为了便于调试程序,Visual LISP提供了一些调试程序的工具,帮助用户迅速查找并改正程序中的错误。VisualLISP提供了监视窗口、检验窗口、符号服务对话框、中断和继续执行程序的模式、命令跟踪、跟踪堆栈、跟踪窗口等调试程序的工具。,通过图6-1示View下拉菜单和View工具栏可以调用监视窗口、检验窗口
2、等调试工具。,检验窗口跟踪堆栈出错跟踪符号服务监视窗口自动匹配窗口断点窗口编译输出窗口VisualLISP控制台浏览图形数据库选择工具栏,图6-1 View下拉菜单,打开监视窗口匹配符号服务堆栈跟踪功能打开检测窗口激活控制台窗口确定活动窗口切换到AutoCAD图形窗口,通过图6-2所示Debug下拉菜单和Debug工具栏的选项可以设置程序暂停的模式和继续程序运行的方式。,只执行一步表达式求值。执行到下一个断点,如无断点,则执行一个完整的表达式求值。执行到下一个断点,如无断点,则执行一个最外层的表达式求值。继续执行程序结束当前程序。返回到控制台的上一层中断顶层读算写循环。结束所有当前活动的断点循
3、环并返回到控制台的顶层读算写循环。添加监视回到最近一次监视窗口的环境设置/删除断点清除所有的断点回到源程序上的最近一次的断点跟踪命令立即暂停出错断开自动运行终止求值,图6-2 Debug下拉菜单,调试指示器按钮显示上一个断点添加监视设置或取消断点切换重置为顶层退出当前层继续执行跳出表达式下一个表达式下一层嵌套表达式,Debug工具栏,6.2 监视窗口 监视窗口用于监视变量、函数在程序运行过程中的结果。选择菜单DebugWatch Last Evaluation。将弹出图6-3所示的监视窗口。,图6-3 监视窗口,1.监视窗口的工具栏 监视窗口的工具栏有四个图像按钮,从左至右依次是:添加监视:将
4、新的变量加入到监视窗口。清除变量:清除监视窗口内的所有的变量。排序:将监视窗口内的变量名按字母顺序排序。复制到跟踪/日志:将监视窗口的内容复制到跟踪窗口。如果打开了日志选项,监视窗口中的这些内容也将被复制到跟踪日志文件。,2.监视窗口的快捷菜单 选择监视列表中的某一项并单击鼠标右键,可显示图6-4所示监视窗口的快捷菜单。,调用检验功能,查看所选值。将所选变量的值复制到系统变量*obj*中。将所选变量值加上一个单引号前缀,打印到控制台窗口。对所选变量调用符号服务对话框。调用自动匹配选项对话框,用所选变量名作自动匹配参数。从监视窗口中删除所选变量。,图6-4监视窗口的快捷菜单,3.将变量加入到监视
5、窗口有三种途径可以将新的变量加入到监视窗口。,(1)点取工具栏上的添加监视按钮,在随后弹出的图6-5所示的添加监视窗口内填入变量名,然后单击OK按钮。,图6-5添加监视窗口,(2)亮显要添加的变量名,然后点取工具栏上的添加监视按钮,随后弹出的图6-6所示的已填写了该变量名的添加监视窗口,然后单击OK按钮。(3)将光标移至将要添加的变量名,单击鼠标右键,在随后弹出的快捷菜单上选取Add Watch菜单项,将弹出已填写了该变量名的添加监视窗口,然后单击OK按钮。,4.监视变量的值 监视列表的每一行的格式是变量名=变量值,例如:A=1。如果程序尚未运行,变量的值是空的;随着程序的运行,在监视窗口可以
6、看到变量的值也在不断变化。5.利用断点和监视窗口调试程序 假定在编辑器窗口已键入了图6-6所示的源程序。该程序的功能是根据用户输入的两个对角点绘制矩形。首先检查该程序是否存在语法错误。选择菜单ToolsText in Editor或单击按钮,在Build Output(输出)窗口显示;Check done.。说明该程序没有语法错误。选择菜单ToolsLoad Text in Editor或单击按钮,VisualLISP自动将控制切换到AutoCAD界面。当出现输入矩形的一个角点:的提示时,输入(0,0)点,该点是p1点的坐标;当出现输入矩形的对角点:的提示时,输入(100,100)点,该点是p
7、2点的坐标。程序运行结束,只得到了矩形的两条边,显然,这不是预期的运行结果。,下面演示如何利用监视窗口调试程序。调试程序的步骤如下:(1)确定要监视的变量。选择菜单DebugAdd Watch或单击工具栏上的添加监视按钮,在随后弹出的添加监视窗口内填入变量名p1,然后单击OK按钮。用同样的操作监视变量P2、P3、P4。,图6-6监视P1、P2、P3、P4点的值,(2)从图6-7所示监视窗口可以看到:P1=0.0 0.0 0.0、p2=100.0 0.0、p3=100.0 100.0 0.0、P4=nil 100.0。说明P4点的X坐标是无定义的,而X坐标是(car pl)的返回值,检查(car
8、 pl),car是正确的,亮显pl,单击添加监视按钮,监视窗口内出现PL=nil,PL本不是该程序的变量,是p1的误写。(3)修改源程序代码,将pl改写为p1;重新加载、运行该程序;直到该程序可以正常运行,调试结束。,6.3 在不设置断点的情况下分步调试程序 分步调试就是将一个完整的程序分为若干步,逐步调试。每步可以是最内层的一个表达式,也可以是一个复杂的表达式,还可以是多个表达式。可以通过设置断点将程序分为若干段,也可以不用断点而是通过步长将程序分为若干步。结合下例程序介绍几种调试程序的方法。【例6-1】定义绘制矩形的命令,矩形的一个角点、宽、高和旋转角为交互输入的参数。程序的源代码如下:(
9、defun c:rectr(/w h alf p1 p2 p3 p4)(setq p1(getpoint 输入矩形的一个角点:)w(getdist p1 输入矩形的宽:)h(getdist p1 输入矩形的高:)alf(getangle p1 输入矩形的旋转角:),(setq p2(polar p1 alf w)(setq p3(polar p2(+alf(*0.5 pi)h)(setq p4(polar p3(+alf pi)w)(command pline p1 p2 p3 p4 c)(princ)1.从第一个表达式开始,逐步调试程序(1)选择菜单FileOpen File或单击按钮,将例
10、6-1所示源代码录入文本编辑窗口。选择菜单DebugAdd Watch或单击按钮,监视变量w、h、alf、p1、p2、p3、p4。选择菜单ToolsLoad Text in Editor或单击按钮,加载该程序。(2)通过菜单DebugStop Once,使之处于打开的状态。(3)单击按钮,切换到AutoCAD窗口,在AutoCAD的Command:提示下,键入rect3命令。,控制自动切换到VisualLISP文本编辑窗口,监视窗口内的变量值均为nil。此时光标停在(defun之前,整个程序被加亮显示。选取下拉菜单Debug的Step Into项、F8功能键或单击按钮,光标停在(setq p1
11、之前,与之匹配的右括号之间被加亮显示。单击按钮,光标停在(getpoint 输入矩形的一个角点:)之前,并亮显该表达式。注意,指示按钮内的I在()之前。单击按钮,程序切换到AutoCAD窗口,出现输入矩形的一个角点:的提示,输入(100,80),程序切换到VisualLISP的文本编辑窗口。光标停在(getpoint 输入矩形的一个角点:)之后,仍然亮显该表达式。注意,指示按钮内的 I 在()之后。,单击按钮,光标停在(getdist p1 输入矩形的宽:)之前,并亮显该表达式。注意,指示按钮内的I回到()之前。监视窗口内的变量p1=100.0 80.0 0.0。重复类似的操作,在AutoCA
12、D窗口输入矩形的宽度为200、高度为150,旋转角为30。在操作过程中指示按钮随时显示着光标相对于表达式的位置,监视窗口显示着这些变量的当前值(注意,alf的单位为弧度)。也说明单击按钮 只执行了一步表达式求值。当光标停在(setq p3(polar p2(+alf(*0.5 pi)h)之前时,单击按钮,整个程序被加亮显示,光标停在整个程序的结尾,再单击以上任一按钮,程序运行结束。切换到AutoCAD窗口,显示着刚才绘制的矩形。,假定程序的第5行误写为(getangl p1 输入矩形的旋转角:),仍旧用上述的方法调试该程序,当执行到输入矩形的旋转角:时,将出现提示;error:no funct
13、ion definition:GETANGL(没有GETANGL这个函数定义)。点取查找按钮,在随后弹出的 FIND 对话框的FindWhat编辑框输入查找内容为 GETANGL,单击 Find按钮,找到getangl并改正为getangle。重新调试程序,直至程序正常运行。,2.自动分步调试程序(1)自动分步调试程序的步骤 将例6-1源代码的文件装入文本编辑窗口。监视变量w、h、alf、p1、p2、p3、p4。加载该程序。选择菜单DebugAnimate。在AutoCAD的Command:提示下,键入rect3命令。Visua lLISP自动切换到文本编辑窗口。随着光标的位置、指示按钮 内I
14、和()的变化,自动地执行每一个表达式的求值,监视窗口内的变量值也相应地改变。如果遇到了错误的函数调用,程序停止运行,并报告;error:no function definition:信息。找到并改正错误的函数。继续调试程序,直至程序正常运行。,(2)设置每步延迟的时间 选择菜单ToolsEnvironmant OptionsGeneral Options 弹出图6-7所示General Options对话框。单击该对话框的Diagnostic(诊断)卡,在Animation delay编辑框输入每步延迟的时间(以毫秒为单位),单击确定按钮即可。,图6-7诊断选项卡,6.4 断点循环 表达式是A
15、utoLISP程序的基本单元,LISP的工作实际上是不断地对表达式进行读入、求值和输出操作,在LISP术语中,被称为读算写循环。如果不用调试工具而是正常地运行AutoLISP程序时,程序将处于顶层的读算写循环。如果在VisualLISP控制台窗口内对表达式求值时,也是处于顶层的读算写循环。如果程序在运行时被中断或挂起,VisualLISP将控制转交给控制台,就进入了断点循环(Break loop)。断点循环是一个单独的读算写循环,它嵌套在原有的读算写循环内。断点循环也可以被中断,这时将开始一个嵌套于该断点循环内的读算写循环。断点循环相对于顶层循环嵌套的层数称为该中断的层数。,进入断点循环时,V
16、isualLISP将在控制台提示_$前加一个数字来指出所处循环的层数。例如,当首次进入程序的断点循环时,提示为_1_$。如果处于断点循环状态,就不能将控制切换到AutoCAD窗口。从断点循环退出,将恢复上一层循环。如果在该断点循环中修改了某变量的值,程序继续运行时将使用变量修改后的值。断点循环分为可继续断点循环和不可继续断点循环。,1.可继续的断点循环 可继续的断点循环是指可以在程序中断处,继续向下执行剩余的表达式。用以下方法进入可继续断点循环:(1)打开Stop Once模式,碰到带调试信息的表达式时。(2)遇到带Debug on Entry(进入时调试)标志的函数时。(3)遇到程序中设置的
17、断点时。(4)单击暂停按钮进入断点循环时。(5)在前一个断点循环状态下,执行Step Into、Step Over或Step Out时。如果程序在某函数中被中断,可以访问被该函数声明的局部变量,甚至可以在控制台提示下用setq函数修改它们的值。,2.不可继续的断点循环 当程序出现错误导致崩溃时,如果设置了Break On Error选项,将激活一个不可继续的断点循环。此时可以访问出错环境中的所有变量,但不能继续执行程序或执行任何单步调试程序的命令。如果工具栏上的单步调试的按钮、或继续运行的按钮 处于可用状态,说明此时进入了可继续的断点循环。处于不可继续的断点循环时,选取Debug菜单的Rese
18、t to Top Level项或单击按钮,退出断点循环并跳转至控制台顶层循环;选取Debug菜单的Quit Current项或单击按钮,退出断点循环并返回到上一层循环。,6.5 利用断点调试程序 运行的程序遇到断点时,将产生一个中断。当程序中断时,可查看、分析变量的值,修改程序的源代码。利用断点可提高调试程序的效率。1.有关断点的操作(1)在程序中设置/删除断点 只能在VisualLISP的文本编辑器窗口内设置断点。断点应位于表达式的左、右括号上。设置断点的步骤如下:将光标移到需要程序暂停的位置。例如,需要在某表达式 之前暂停,则应将光标移至与表达式的左括号相邻的位置。,选择菜单DebugTo
19、ggle Breakpoint、单击按钮 或按F9键。如果该位置没有断点,就加入一个断点,否则,删除该断点。单击鼠标右键在快捷菜单中选择Toggle Breakpoint项也可以设置或删除断点。如果光标不与括号相邻,Visual LISP暂时将光标移到后面最近的右括号处,并通过对话框询问用户是否在该处设置断点。选择菜单DebugClear All Breakpoints项,删除已设置的所有断点。,(2)改变断点的颜色 VisualLISP用高亮矩形显示每一个断点,默认情况下,活动的断点是红色的。选择菜单ToolsWindow AttributesConfigure Current,通过随后弹出
20、的Window Attributes对话框内的WINDOW-TEXT下拉列表的:BPT-ACTIVE项可改变断点的颜色。(3)临时禁用断点 断点可以被临时禁用和恢复使用。禁用断点的步骤如下:将光标置于断点处并单击鼠标右键。从显示的快捷菜单上选择Breakpoints service项,将弹出图6-8所示断点服务对话框。,图6-8断点服务对话框,在断点服务对话框中单击Disable按钮可临时禁用该断点;若该断点已被禁用,图6-9所示断点服务对话框将出现Enable按钮,单击该按钮,所选断点将改变为可用状态。默认情况下,被禁用的断点显示为蓝色。用设置断点颜色的方法也可以改变被禁用断点的颜色。(4)
21、浏览和编辑程序中的断点 选择菜单ViewBreakpoints Window将看到图6-9所示的断点对话框。,图6-9断点对话框,该断点窗口列出了所有编辑器窗口的断点。其中有程序6-1.lsp的3个断点、6-2.lsp的2个断点。每项包含断点的源文件名以及断点在源文件中的位置,位置是以0开始的西文字符数量,前面的+号表示该断点是活动的,-号表示该断点是被禁用的。单击该对话框的Delete all按钮可以删除所有的断点;亮显一项,单击Show按钮可显示该断点所在的源文件及其在源文件中的位置;单击Delete按钮可删除该断点;单击Edit按钮可打开图6-9所示的断点服务对话框,利用该对话框可以改变
22、断点可用或禁用的状态。(5)断点的生命周期 可以在加载程序之前或之后设置断点。如果在加载程序之后设置断点,该断点只有在重新加载程序之后才有效。,2.在断点处继续运行程序 运行的程序遇到断点时,将产生一个中断,即断点循环。单击分布调试按钮、和 可继续运行程序。如果在复杂的表达式之内还有一些断点,单击按钮 和,首先在断点处暂停。此外还有以下控制程序继续运行的工具栏按钮、快捷键或Debug菜单的菜单项。Continue或Ctrl+F8:继续执行程序直至遇到下一个断点(如果有)或程序结束。Quit Current或Ctrl+Q:结束当前程序,返回到控制台的上一层断点循环。Reset to Top Le
23、vel或Ctrl+R:结束当前程序,结束所有的断点循环。,3.利用断点调试程序实例【例6-2】定义绘制图6-10所示图形的命令,p0、d、b、t1、alf是交互输入的参数。,图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应改为t1(setq a
24、lf(getangle p0 nEnter alf:);断点1的位置(setq r(*0.5 d)bl(*0.5 b)(setq l(sqrt(-(*r r)(*b1 b1)(setq sit(tan b1 l);tan应改为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 p
25、2 p3 l p4 p5 c),选择菜单FileOpen File将例6-2所示源代码的文件装入文本编辑窗口。选择菜单DebugAdd Watch或单击按钮,监视变量p0、d、b、t1、alf、r、l、b1、sit、p1、p2、p3、p4、p5。加载该程序,单击按钮,在AutoCAD的Command:提示下键入TUXING命令,程序停止运行,出现提示;error:bad argument type:numberp:nil(错误的参数类型,出现了无定义的参数)。将光标移至程序的第6行末尾,选择菜单DebugToggle Breakpoint、按功能键F9或单击按钮,在该处设置一个断点。,单击按钮
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 调试 程序 清华 CAD 二次开发 LISP
链接地址:https://www.31ppt.com/p-6144682.html