- 浏览: 238548 次
-
文章分类
最新评论
-
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 9883环境: windows xp emacs 23 自已编译的cv ... -
Emacs Lisp中的hash table
2008-03-10 16:30 2337(defun zj-hash-test () "h ... -
Emacs Lisp与Shell的交互
2008-03-10 16:27 4613一直以来对于w3m、tramp、dired等与shell关系 ... -
Programming in Emacs Lisp笔记(十八) 终结
2007-07-20 11:34 2736笔记连载完毕。感谢大家的支持! 离线版本可以从这里下载。 -
Programming in Emacs Lisp笔记(十六).emacs文件
2007-07-20 11:10 6556.emacs文件 Emacs的缺省 ... -
Programming in Emacs Lisp笔记(十五)准备图表
2007-07-19 16:36 2464准备图表 我们的目标 ... -
Programming in Emacs Lisp笔记(十四)统计defun中的单词数量
2007-07-19 16:36 2936统计defun中的单词数量 我们的下一个计划是统计函数定义中 ... -
Programming in Emacs Lisp笔记(十三)计数:重复和正则表达式
2007-07-19 16:28 2705计数:重复和正则表达 ... -
Programming in Emacs Lisp笔记(十二)正则表达式查询
2007-07-19 16:26 4605正则表达式查询 在Emacs中正则表达式查询使用得很广泛。在 ... -
Programming in Emacs Lisp笔记(十一)循环和递归
2007-07-04 18:18 3626循环和递归 Emacs Lisp有 ... -
Programming in Emacs Lisp笔记(十)Yanking Text Back
2007-07-04 17:59 2990Yanking Text Back 当使用'kill'命令剪 ... -
Programming in Emacs Lisp笔记的离线版本(2007年7月20日更新,完整版)
2007-07-03 15:45 5260使用muse生成了这个笔记的html版本。里面有带链接的索引, ... -
Programming in Emacs Lisp笔记(九)List的实现
2007-07-03 14:20 2260List的实现 Lisp中list使 ... -
Programming in Emacs Lisp笔记(八)剪切和存储文本
2007-07-02 12:04 2771剪切和存储文本 当使用'kill'命令剪切文本时,Emacs ... -
Programming in Emacs Lisp笔记(七)基础函数:car, cdr, cons
2007-06-29 10:09 3857基础函数:car, cdr, cons Lisp中car,c ... -
Programming in Emacs Lisp笔记(六) Narrowing and Widening
2007-06-28 10:41 2356Narrowing and Widening Narrowi ... -
Programming in Emacs Lisp笔记(五)一些更复杂的函数
2007-06-27 13:04 2757一些更复杂的函数 copy-to-buffer的函数定义 ... -
Programming in Emacs Lisp笔记(四)与缓冲区有关的函数
2007-06-26 13:38 3242部分与缓冲区有关的函数 查找更多信息 可以通过C-h f查看 ... -
Programming in Emacs Lisp笔记(三)编写函数
2007-06-25 15:01 4214编写函数 关于基本函数 ... -
Programming in Emacs Lisp笔记(二)实践
2007-06-25 15:01 2450实践 执行代码 通过C-x C-e执行代码 缓冲区名称 b ...
相关推荐
Org Mode 是 **Emacs** 中的一个强大文本编辑和组织工具,广泛用于笔记、项目管理、任务跟踪以及文档编写。它支持多种语法高亮和结构化标记,使得用户可以方便地组织和格式化文本。当与literate-elisp结合使用时,...
综上所述,"org-babel-eval-in-repl"是Emacs org-mode的一个强大特性,它允许用户异步地在各种编程语言的REPL中执行代码块,这在进行literate programming、代码测试和调试时非常实用。通过Emacs Lisp的扩展能力,...
- **org-mode**: 这是Emacs的一个强大工作流程管理工具,用于任务管理、笔记记录、项目规划等,同时也常用于Literate Programming。 - **EmacsEmacsLisp**: 这可能是一个误打或者强调,表明内容涉及到Emacs及其内置...
`org-mode` 是 `emacs` 中的一个强大工作区管理工具,它支持任务管理、笔记记录、项目规划以及代码编辑。在 `eless` 中,`org-mode` 用于组织脚本结构,并且可以用于代码的编译和执行。`org-babel` 是 `org-mode` 的...
Org Mode是一种强大的文档组织和管理工具,它支持创建笔记、任务列表,并且可以嵌入各种代码块进行实时执行,这在文献注解编程(Literate Programming)中尤其有用。 在安装`ob-ess-julia`后,用户可以在Org Mode...
6. **org-mode**:Org Mode是Emacs的一种模式,常用于组织、计划和笔记,也可以用于生成literate programming的源代码。 **文件名称列表解析** 提供的文件名称列表只有一个:"babel-master",这通常表示下载或克隆...
Org Mode是Emacs中的一个高度可扩展的文本编辑模式,广泛用于笔记、项目管理、任务追踪甚至编写文档。`ob-clojure-literate`正是将Clojure代码嵌入到Org Mode文档中的桥梁,使得开发者能够在同一个文件中编写文档和...
"org-mode" 是一个流行的Emacs模式,常用于组织任务、笔记和编写文档,包括文学编程。 "query-engine" 提示我们这里有一个用于执行查询的引擎,可能支持SPARQL或其他类似的查询语法。 "triplestore" 指的是存储...