找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 6058|回复: 20

[他山之石] Autolisp当错误发生时候,找到具体发生在哪一行

[复制链接]

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-8-21 23:12:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
Determine in which line of AutoLISP code an error exists
In much previous versions of AutoLISP and Visual LISP (VLISP), when an AutoLISP function terminated unexpectedly in the drawing editor, the entire expression would display on the screen, which made it easy to locate the exact line which
contained the error. When this situation occurs In recent AutoCAD versions, locating the error is not as easy because only a message such as "Bad argument type: lentityp' (or stringp)" displays. The error message unfortunately does not state
in which line of code the error exists.
How errors in AutoLISP code are handled has been changed. Now, to locate the error in the code, you will need to use the Visual Lisp IDE. Although it may require that you learn about the IDE debug features, you'll find that it's a much better environment to debug AutoLISP code than in previous releases of AutoCAD. What you need to do to enable this facility is to perform the following steps:
1. Open the Visual Lisp IDE at the beginning of your AutoCAD session by typing VLISP or VLIDE at the command line.

2. Select the Debug menu in the IDE, and select 'Break On Error'.

3. Load your AutoLISP code and run it.
When an error in your code occurs, you'll be put back into the Visual LISP IDE. All you then need to do, to find the line in the code that contains the error is to select the 'Last Break' option on the Debug Toolbar, or the 'Last Break Source' from the Debug menu.
There are many more powerful tools available to debug yourAutoLISP code using the Visual Lisp IDE, To learn about them, refer to the Visual LISP Developer's Guide >> Debugging Programs for more information about the IDE and its debugging features.



评分

参与人数 1D豆 +1 收起 理由
/db_自贡黄明儒_ + 1 很给力!经验;技术要点;资料分享奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 593个

财富等级: 财运亨通

发表于 2013-8-22 05:59:12 | 显示全部楼层
中文版
调试-〉上一断点源码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1915个

财富等级: 堆金积玉

发表于 2013-8-22 07:51:29 | 显示全部楼层
我一般都是使用视图菜单中的错误跟踪来查看出错的位置,很方便的!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1915个

财富等级: 堆金积玉

发表于 2013-8-22 07:54:37 | 显示全部楼层
无标题.png
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 23个

财富等级: 恭喜发财

发表于 2013-8-22 07:55:45 | 显示全部楼层
我和楼上一样,错误跟踪会提示那一句代码出错
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

发表于 2013-8-22 08:10:25 | 显示全部楼层
我原来是放(alert "ok"),看错误发生在ok之前还是之后不断找的。向各位学习了

点评

我是用(princ "111")...(princ "222"),哈哈  详情 回复 发表于 2013-9-6 16:56
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

 楼主| 发表于 2013-8-22 08:11:23 | 显示全部楼层
不需要VLISP IDE,发现错误的方法:

(defun *error* (msg)
  (vl-bt)
)


测试:

Command: (defun *error* (s) (vl-bt))
*ERROR*

Command:
(defun C:BUGGY ()
  (setq a (getint "\nEnter a number: "))
  (setq b (/ a 0))
  (princ)
)

C:BUGGY

Command: BUGGY

Enter a number: 3
Backtrace:
[0.48] (VL-BT)
[1.44] (*ERROR* "divide by zero")
[2.39] (_call-err-hook # "divide by zero")
[3.33] (sys-error "divide by zero")
:ERROR-BREAK.28 nil
[4.25] (/ 3 0)
[5.19] (C:BUGGY)
[6.15] (#)
[7.12] (# "(C:BUGGY)" T #)
:CALLBACK-ENTRY.6 (:CALLBACK-ENTRY)
:ARQ-SUBR-CALLBACK.3 (nil 0)

点评

由于不会VLISP编辑器。 我现在是利用出错处理,如果程序错误就 打印各个变量的赋值情况。从而判断出错代码可能的位置区域  详情 回复 发表于 2013-8-22 10:18

评分

参与人数 2D豆 +6 收起 理由
/db_自贡黄明儒_ + 1 这个办法好,今后就都这么干了。
wowan1314 + 5 +10086 下面这个数据是什么意思呀?

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-8-22 09:25:14 | 显示全部楼层
此贴必火,占个楼先
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-8-22 10:18:32 | 显示全部楼层
本帖最后由 wowan1314 于 2013-8-22 10:20 编辑
XDSoft 发表于 2013-8-22 08:11
不需要VLISP IDE,发现错误的方法:

(defun *error* (msg)

由于不会VLISP编辑器。
我现在是利用出错处理,如果程序错误就 打印各个变量的赋值情况。从而判断出错代码可能的位置区域
  1. ;;变量监视函数,如果出错。则输出->出错信息及各变量的赋值情况。
  2. ;;用法 在程序开始处(aa:ever-err '(各个变量名。。))即可.
  3. ;;程序不出错就没有变量赋值情况。
  4. (defun aa:ever-err (lst )
  5.     (setq *olderr* *error* *error* aa:evererr1 *监视变量表* lst)
  6. )
  7. (defun aa:evererr1 (x )
  8.     (princ x)
  9.     (aa:ever-err2 *监视变量表*)
  10.     (setq *error* *olderr* *olderr* nil *监视变量表* nil)
  11. )
  12. (defun aa:ever-err2 (*监视变量表*)
  13.     (mapcar
  14.         '(lambda(e1 e2)
  15.             (princ (strcat "\n" e1 " = "))
  16.             (prin1 (eval e2))
  17.         )
  18.         (mapcar 'vl-princ-to-string *监视变量表*)
  19.         *监视变量表*
  20.     )
  21. )

点评

试了下这个: 命令: (defun *error* (msg) (_> (vl-bt) (_> ) *ERROR* 命令: (/ 3 0) 反向跟踪: [0.44] (VL-BT) [1.40] (*ERROR* "除数为零") [2.35] (_call-err-hook # "除数为零") [3.29] (sys-erro  详情 回复 发表于 2013-8-22 10:30
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-8-22 10:30:18 | 显示全部楼层
wowan1314 发表于 2013-8-22 10:18
由于不会VLISP编辑器。
我现在是利用出错处理,如果程序错误就 打印各个变量的赋值情况。从而判断出错代 ...

试了下这个:
命令: (defun *error* (msg)
(_>   (vl-bt)
(_> )
*ERROR*

命令: (/ 3 0)
反向跟踪:
[0.44] (VL-BT)
[1.40] (*ERROR* "除数为零")
[2.35] (_call-err-hook #<SUBR @08d3be74 *ERROR*> "除数为零")
[3.29] (sys-error "除数为零")
:ERROR-BREAK.24 nil
[4.21] (/ 3 0)
[5.15] (#<SUBR @08d3bec4 -rts_top->)
[6.12] (#<SUBR @08d30334 veval-str-body> "(/ 3 0)" T #<FILE internal>)
:CALLBACK-ENTRY.6 (:CALLBACK-ENTRY)
:ARQ-SUBR-CALLBACK.3 (nil 0)



反向跟踪
0,1,2,3 应该是序号
44,40,35那些应该是反向中的执行的内部具体时间什么的吧,这vl-bt手册没看到啊,内部函数?
阁老,你试试用这个定义错误函数,应该更简洁了。

点评

嗯。 这个函数非常好。 基本能准确定位了。 另外有个疑问是: 如果代码中有(setq a)语法错误。CAD加载的话只是提示语法错误。没提示那句语法错误。 好像VLISP编辑器可以知道那句语法有错误。。。 这个  详情 回复 发表于 2013-8-22 10:41
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-8-22 10:41:36 | 显示全部楼层
本帖最后由 wowan1314 于 2013-8-22 10:48 编辑
newer 发表于 2013-8-22 10:30
试了下这个:
命令: (defun *error* (msg)
(_>   (vl-bt)

嗯。 测试了下。这个函数非常好。  基本能准确定位了。

另外有个疑问是:
如果代码中有(setq  a)或(if A B C D)语法错误。CAD加载的话只是提示语法错误。没提示那句语法错误。
好像VLISP编辑器可以知道那句语法有错误。。。

这个 语法错误 不用VLISP编辑器 可以定位到吗?

点评

命令: (setq a) 反向跟踪: [0.35] (VL-BT) [1.31] (*ERROR* "语法错误") [2.26] (_call-err-hook # "语法错误") [3.20] (sys-error "语法错误") :ERROR-BREAK.15 nil [4.12] (# "(setq a)" T #) :CALLBACK-E  详情 回复 发表于 2013-8-22 11:17
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6530个

财富等级: 富甲天下

发表于 2013-8-22 10:57:56 | 显示全部楼层
不能不感慨自己老了。
现在不写程序了,偶尔几句代码,错了随便就可以找到,也就没有在意怎么去跟踪了。
记得早些年,只要把*error*设为nil,出错语句就会在命令行显示出来,现在的acad把这个屏蔽了,不管怎么设置,总是默认出来出错信息。

点评

是不是从有了VLISP IDE后,错误信息就给屏蔽掉了? ADESK初衷应该是程序要在VLSP IDE里面调试好。  详情 回复 发表于 2013-8-22 11:20
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-8-22 11:17:17 | 显示全部楼层
wowan1314 发表于 2013-8-22 10:41
嗯。 测试了下。这个函数非常好。  基本能准确定位了。

另外有个疑问是:

命令: (setq a)
反向跟踪:
[0.35] (VL-BT)
[1.31] (*ERROR* "语法错误")
[2.26] (_call-err-hook #<SUBR @08d3be74 *ERROR*> "语法错误")
[3.20] (sys-error "语法错误")
:ERROR-BREAK.15 nil
[4.12] (#<SUBR @08d30334 veval-str-body> "(setq a)" T #<FILE internal>)
:CALLBACK-ENTRY.6 (:CALLBACK-ENTRY)
:ARQ-SUBR-CALLBACK.3 (nil 0)

试了下 (setq a) ,可以提示出来啊
  1. [4.12] (#<SUBR @08d30334 veval-str-body> "(setq a)" T #<FILE internal>)

点评

测试以下代码。  详情 回复 发表于 2013-8-22 11:42
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-8-22 11:20:18 | 显示全部楼层
ll_j 发表于 2013-8-22 10:57
不能不感慨自己老了。
现在不写程序了,偶尔几句代码,错了随便就可以找到,也就没有在意怎么去跟踪了。
...

是不是从有了VLISP IDE后,错误信息就给屏蔽掉了? ADESK初衷应该是程序要在VLSP IDE里面调试好。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-8-22 11:42:39 | 显示全部楼层
本帖最后由 wowan1314 于 2013-8-22 12:18 编辑
newer 发表于 2013-8-22 11:17
命令: (setq a)
反向跟踪:
[0.35] (VL-BT)

vlisp编辑器的“检查选定文字”的功能,就可找到 那句有语法错误。
不知道 这个命令 是否有对应的函数??
  1. [检查文字 <未命名 0> 正在加载... SELECTION]
  2. .
  3. ; 错误: SETQ 中参数太少: (SETQ A)
  4. ; 检查完成.
复制代码
测试以下代码。
  1. (defun c:ttt ()
  2.   (if a
  3.     (setq a)
  4.     (setq b 1)
  5.   )
  6. )

点评

这个真没有,可能是运行时候的错误能直接定位吧。  详情 回复 发表于 2013-8-22 14:01
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-12-23 08:05 , Processed in 0.548091 second(s), 75 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表