- 浏览: 234140 次
文章分类
最新评论
-
sunyukun8888:
多谢啦!
重新整理后的Oracle OAF学习笔记——离线版本 -
singlespider:
很不错啊,谢楼主
重新整理后的Oracle OAF学习笔记——离线版本 -
000fuli:
000fuli 写道请问各位学长:你们可以下载吗?能下载的烦请 ...
重新整理后的Oracle OAF学习笔记——离线版本 -
000fuli:
请问各位学长:你们可以下载吗?能下载的烦请发一份到fuli.w ...
重新整理后的Oracle OAF学习笔记——离线版本 -
goodscript:
确实是不错的好文章!
重新整理后的Oracle OAF学习笔记——离线版本
调试
GNU Emacs中有两个高度器,debug和edebug。第一个是Emacs内建的可以随时使用它;第二个需要借助一些函数才能使用。
debug
假设你编写了用于加1的函数。但函数有个bug。你误将1-输入为1=了。函数定义如下:
(defun triangle-bugged (number)当传递4给这个函数时:
"Return sum of numbers 1 through NUMBER inclusive."
(let ((total 0))
(while (> number 0)
(setq total (+ total number))
(setq number (1= number))) ; Error here.
total))
(triangle-bugged 4)在Emacs 21中,将产生一个*Backtrace*缓冲区,并进入这个缓冲区:
---------- Buffer: *Backtrace* ----------(重新格式化了一下;调试不会自动折行。可以用q退出调试器)
Debugger entered--Lisp error: (void-function 1=)
(1= number)
(setq number (1= number))
(while (> number 0) (setq total (+ total number))
(setq number (1= number)))
(let ((total 0)) (while (> number 0) (setq total ...)
(setq number ...)) total)
triangle-bugged(4)
eval((triangle-bugged 4))
eval-last-sexp-1(nil)
eval-last-sexp(nil)
call-interactively(eval-last-sexp)
---------- Buffer: *Backtrace* ----------
实际上,像这样简单的bug,'Lisp error'这行告诉了我们如何修改定义。函数1=为'void'。
在Emacs 20中,你将看到:
Symbol's function definition is void: 1=这与21版中的*Backtrace*缓冲区中的意思是一样的。
假设你还不是很清楚要如何做?你可以阅读完整的回溯信息。
在GNU Emacs 21中,它将自动启动调试器,并将信息放到*Backtrace*缓冲区中;如果有使用Emacs21,可能需要按下面的方法手工启动调试器。
在*Backtrace*中从下向上读;它说明了Emacs是如何出错的。Emacs执行了一个交互式命令C-x C-e(eval-last-sexp),它执行了triangle-bugged语句。上面的每一行显示了Lisp解释器执行内容。
缓冲区的顶部是:
(setq number (1= number))
Emacs试图执行这个语句;依次来执行,它首先执行内部的语句:
(1= number)
这里发生了错误,如错误信息所说:
Debugger entered--Lisp error: (void-function 1=)
你可以修正这个错误,然后重新执行函数定义,再运行测试代码。
debug-on-entry
GNU Emacs 21在函数出错时自动启动了调试器。GNU Emacs 20不会这样做;它只显示一条出错信息。你需要手工启动调试器。
手工启动的好处是在程序没有bug的时候也可以调试。
你可以调用debug-on-entry函数进入调试器。
输入:
M-x debug-on-entry RET triangle-bugged RET
然后,执行下面的语句:
(triangle-bugged 5)所有版本的Emacs都将产生一个*Backtrace*缓冲区告诉你它将执行triangle-debugged函数:
---------- Buffer: *Backtrace* ----------在*Backtrace*缓冲区中输入d。Emacs将执行triangle-bugged的第一行语句;缓冲区看起来如下:
Debugger entered--entering a function:
* triangle-bugged(5)
eval((triangle-bugged 5))
eval-last-sexp-1(nil)
eval-last-sexp(nil)
call-interactively(eval-last-sexp)
---------- Buffer: *Backtrace* ----------
---------- Buffer: *Backtrace* ----------
Debugger entered--beginning evaluation of function call form:
* (let ((total 0)) (while (> number 0) (setq total ...)
(setq number ...)) total)
* triangle-bugged(5)
eval((triangle-bugged 5))
eval-last-sexp-1(nil)
eval-last-sexp(nil)
call-interactively(eval-last-sexp)
---------- Buffer: *Backtrace* ----------
现在,再次输入d,连续8次慢慢的输入d,Emacs将执行函数定义的另一个语句。
最后缓冲区看起来如下:
---------- Buffer: *Backtrace* ----------最后再输入两次d,Emacs将到达错误的位置,*Backtrace*缓冲区顶部的两行将显示:
Debugger entered--beginning evaluation of function call form:
* (setq number (1= number))
* (while (> number 0) (setq total (+ total number))
(setq number (1= number)))
* (let ((total 0)) (while (> number 0) (setq total ...)
(setq number ...)) total)
* triangle-bugged(5)
eval((triangle-bugged 5))
eval-last-sexp-1(nil)
eval-last-sexp(nil)
call-interactively(eval-last-sexp)
---------- Buffer: *Backtrace* ----------
---------- Buffer: *Backtrace* ----------
Debugger entered--Lisp error: (void-function 1=)
* (1= number)
...
---------- Buffer: *Backtrace* ----------
输入d可以单步执行函数。
可以输入q退出*Backtrace*缓冲区;这将退出跟踪,但并不会退出debug-on-entry。
要退出debug-on-entry,需要调用cancel-debug-on-entry并输入函数名称:
M-x cancel-debug-on-entry RET triangle-bugged RET
debug-on-quit和(debug)
除了debug-on-error或调用debug-on-entry,还有另外两种方法启动debug。
可以通过将变量debug-on-quit设置为t,随时输入C-g(keyboard-quit)来启动debug。这在调试无限循环时很用效。
或者,你可以在代码中插入(debug)以启动调试器,比如:
(defun triangle-bugged (number)
"Return sum of numbers 1 through NUMBER inclusive."
(let ((total 0))
(while (> number 0)
(setq total (+ total number))
(debug) ; Start debugger.
(setq number (1= number))) ; Error here.
total))
edebug源码级的调试器
Edebug是一个源码级的调试器。Edebug通常显示你要调试的源码,并在左边用箭头指出当前执行的行。
你可以单步执行函数,或者快速的执行到断点位置。
下面是tringle-recursively的调试函数:
(defun triangle-recursively-bugged (number)同样,你可以在函数定义后面使用C-x C-e(eval-last-sexp)安装函数,或者将光标放到定义的内部输入C-M-x(eval-defun)。(缺省情况下,eval-defun命令只在Emacs Lisp或Lisp交互模式下才可以工作。)
"Return sum of numbers 1 through NUMBER inclusive.
Uses recursion."
(if (= number 1)
1
(+ number
(triangle-recursively-bugged
(1= number))))) ; Error here.
但是,为了使用Edebug调试函数,你必须使用另一个命令。可以将停留在函数内部然后输入
M-x edebug-defun RET
这将使Emacs自动加载Edebug。在加载完成后,可以将光标放在下面语句的后面输入C-x C-e(eval-last-sexp):
(triangle-recursively-bugged 3)将跳到triangle-recursively-bugged的源码,光标被设置在函数if语句所在的开始行。并且,可以在这行的左边看到一个箭头。箭头标明了函数当前执行的位置。(在例子中,我们使用=>代替;在窗口系统中,你可以看到一个实心的三角形)
=>-!-(if (= number 1)在这里,point的位置显示为-!-。
如果你输入<spc>,point将移到下一个语句;这行将显示如下:</spc>
=>(if -!-(= number 1)
如果继续输入<spc>,point将继续从一个语句移到另一个语句。每次只要语句返回了值,它都会显示到回显区。比如,在point移过number时,你将看到:</spc>
Result: 3 = C-c这表示number的值为3,它的ASCII值是'control-c'。
你可以继续执行,直到错误的位置。在执行之前,这行如下:
=> -!-(1= number))))) ; Error here.
当再次输入<spc>时,将产生错误信息:</spc>
Symbol's function definition is void: 1=
输入q退出Edebug。
要从函数上移除调试的机制,可以重新使用C-x C-e执行函数定义。
Edebug除了跟踪执行外可以做更多的工作。你可以设置它在遇到错误时停止;可以让它显示或修改变量的值;你可以查找出函数被执行了多少次,等等。
发表评论
-
emacs中使用semantic实现c代码自动完成功能
2008-11-25 16:29 9783环境: windows xp emacs 23 自已编译的cv ... -
Emacs Lisp中的hash table
2008-03-10 16:30 2243(defun zj-hash-test () "h ... -
Emacs Lisp与Shell的交互
2008-03-10 16:27 4524一直以来对于w3m、tramp、dired等与shell关系 ... -
Programming in Emacs Lisp笔记(十八) 终结
2007-07-20 11:34 2690笔记连载完毕。感谢大家的支持! 离线版本可以从这里下载。 -
Programming in Emacs Lisp笔记(十六).emacs文件
2007-07-20 11:10 6503.emacs文件 Emacs的缺省 ... -
Programming in Emacs Lisp笔记(十五)准备图表
2007-07-19 16:36 2346准备图表 我们的目标 ... -
Programming in Emacs Lisp笔记(十四)统计defun中的单词数量
2007-07-19 16:36 2814统计defun中的单词数量 我们的下一个计划是统计函数定义中 ... -
Programming in Emacs Lisp笔记(十三)计数:重复和正则表达式
2007-07-19 16:28 2617计数:重复和正则表达 ... -
Programming in Emacs Lisp笔记(十二)正则表达式查询
2007-07-19 16:26 4514正则表达式查询 在Emacs中正则表达式查询使用得很广泛。在 ... -
Programming in Emacs Lisp笔记(十一)循环和递归
2007-07-04 18:18 3546循环和递归 Emacs Lisp有 ... -
Programming in Emacs Lisp笔记(十)Yanking Text Back
2007-07-04 17:59 2943Yanking Text Back 当使用'kill'命令剪 ... -
Programming in Emacs Lisp笔记的离线版本(2007年7月20日更新,完整版)
2007-07-03 15:45 5213使用muse生成了这个笔记的html版本。里面有带链接的索引, ... -
Programming in Emacs Lisp笔记(九)List的实现
2007-07-03 14:20 2121List的实现 Lisp中list使 ... -
Programming in Emacs Lisp笔记(八)剪切和存储文本
2007-07-02 12:04 2662剪切和存储文本 当使用'kill'命令剪切文本时,Emacs ... -
Programming in Emacs Lisp笔记(七)基础函数:car, cdr, cons
2007-06-29 10:09 3770基础函数:car, cdr, cons Lisp中car,c ... -
Programming in Emacs Lisp笔记(六) Narrowing and Widening
2007-06-28 10:41 2297Narrowing and Widening Narrowi ... -
Programming in Emacs Lisp笔记(五)一些更复杂的函数
2007-06-27 13:04 2637一些更复杂的函数 copy-to-buffer的函数定义 ... -
Programming in Emacs Lisp笔记(四)与缓冲区有关的函数
2007-06-26 13:38 3152部分与缓冲区有关的函数 查找更多信息 可以通过C-h f查看 ... -
Programming in Emacs Lisp笔记(三)编写函数
2007-06-25 15:01 4140编写函数 关于基本函数 ... -
Programming in Emacs Lisp笔记(二)实践
2007-06-25 15:01 2399实践 执行代码 通过C-x C-e执行代码 缓冲区名称 b ...
相关推荐
Programming in Emacs Lisp英文版
An Introduction to Programming in Emacs Lisp Second Edition 经典中的经典!
Robert Chassell:An Introduction to Programming in Emacs Lisp
emacs官网上的那个字体太不好了,这是用源文件重编的,看起来不错
An Introduction to Programming in Emacs Lisp, 3rd Edition
An Introduction to Programming in Emacs Lisp [3.10].chm
Programming in Emacs Lisp: An Introduction (美)Robert J.Chassell 著 毛文涛、吕芳 译 洪峰 审校 本书的作者罗伯特·卡塞尔是自由软件基金会的合创人之一,也是理查德·斯托曼博士青年时期结交的挚友,他...
GNU Emacs Lisp编程入门(清晰版) 英文名:An Introduction to Programming in Emacs Lisp
GNU emacs Lisp manual This is a very interesting text, useful to write and program in several languages. Emacs is a editor made in Lisp, a artificial intelligence language.
GNU EMACS lisp编程入门.djvuGNU EMACS lisp编程入门.djvuGNU EMACS lisp编程入门.djvuGNU EMACS lisp编程入门.djvuGNU EMACS lisp编程入门.djvuGNU EMACS lisp编程入门.djvuGNU EMACS lisp编程入门.djvu
Atom-language-emacs-lisp.zip,emacs lisp和yasnippet支持atom和github。Emacs Lisp支持,atom是一个用web技术构建的开源文本编辑器。
gnu emacs lisp 编程指南, 很好的一本书
emacs lisp 函数手册,emacs 24.3版本
GNU Emacs Lisp Reference Manual For Emacs Version 22.1 Revision 2.9, April 2007
GNU Emacs Lisp Reference Manual 英文无水印pdf pdf所有页面使用FoxitReader和PDF-XChangeViewer测试都可以打开
学习 EMACS 和 LISP 极好的入门教材,这可是好东西
emacs lisp refrence manual, for emacs lisp progrmming
强大的emacs lisp编程 不仅仅适用于初学者