Gambit 5.调试.doc_第1页
Gambit 5.调试.doc_第2页
Gambit 5.调试.doc_第3页
Gambit 5.调试.doc_第4页
Gambit 5.调试.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Gambit 5.调试表达式的执行可能因为下列原因而停止: 1. 运算错误,比如除0。 2. 用户中断运算 (通常是通过输入)。 3. 停在断点上等。 4. 单步模式被启动。当运算被停止,一个内嵌REPL在运行上下文中被启动。5.1 调试命令,? 显示内嵌REPL命令(逗号命令形式)的概要。,h 显示最后的执行错误。,(h xxx) 显示名为xxx的过程定义或宏定义。 例: ,(h time)将显示time的帮助内容。,q 终止Gambit进程,状态值为0。相当于调用(exit 0),qt 终止当前线程(若为主线程,则为终止Gambit进程)。,t 退回到顶层REPL。,d 退回到上一层REPL。,c 在离开当前REPL之前,继续当前的执行。这个命令只能用在被用户中断,断点停止,或单步执行的情况下。,(c expr) 在离开当前REPL之前,将expr的结果赋给被提示未绑定数据的变量或出错的位置,并继续处理当前运算。 例如: 如果表达式(* (/ x y) 2)因y是0而报错, 那么在当前的REPL输入命令,(c 4) , (* (/ x y) 2) 表达式中的(/ x y)的结果被赋予4这个值(注意: 不是给y赋值,而是出错的表达式),继续表达式的运算。执行这个命令时,要注意数据的类型。对于上面的例子,如果输入命令,(c #f)将会导致*错误。,s 在离开当前REPL之前,继续当前单步模式的执行。这个命令只能用在被用户中断,断点停止,或单步执行的情况下。,l 这个命令有点像,s。当程序调用返回,或者当被调用过程的执行遇到断点时将恢复到单步运行模式。,N 移动到N号帧。改变当前帧之后,显示该帧的一行摘要,如同,y命令。,N+ 向前移动N个帧。改变当前帧之后,显示该帧的一行摘要,如同,y命令。,N- 向后移动N个帧。改变当前帧之后,显示该帧的一行摘要,如同,y命令。,+ 等同于,1+。,- 等同于,1-。,+ 等同于,N+,其中N是在回溯的头部显示的帧数。, 等同于,N-,其中N是在回溯的头部显示的帧数。,y 显示一行当前帧的摘要,以四个字段的形式显示。第一个字段是帧号, 第二个字段是创建该帧的过程或REPL。其余的字段用来描述帧相关的子问题,第三字段是子问题的源代码的位置和第四场是源代码,可能被截断以适应该行显示。如果该信息不足,最后两个字段可能不被显示。,b 从当前帧开始,显示回溯中的每一帧概述。若超过15帧,中间的帧有些会被忽略显示。,be 和,b相同,但是也显示环境。,bed 和,be相同,但是也显示动态环境。,(b X) 从第X帧开始,显示回溯中的每一帧概述。,(be X) 和,(b expr)相同,但是也显示环境。,(bed X) 和,(be expr)相同,但是也显示动态环境。,i 显示当前帧的过程。,e 显示当前帧可访问的环境。 词法变量的绑定被显示为如下格式: variable = expression(当变量是可变的) variable = expression(当变量是不可变的,它可以在编译时优化) 动态绑定参数被显示为如下格式: (parameter) = expression,ed 和,e相同,但是动态环境总是被显示。,(e X) 显示第X帧可访问的环境。,(ed X) 和,(e X)相同,但是动态环境总是被显示。,st 显示当前线程组中线程的状态。一个线程的状态可以是:未初始化,初始化,活跃,和终止(正常或异常)。活动线程可以运行,休眠,等待同步对象(互斥体,条件变量或端口)也可能会超时。,(st expr) 显示特定的线程或线程组的状态。 expr的值必须是一个线程或线程组。,(v expr) 开始新的REPL来访expr的值X,X在当前帧执行expr获得。5.2 调试例子$ gsiGambit v4.8.5 (define (invsqr x) (/ 1 (expt x 2) (define (mymap fn lst) (define (mm in) (if (null? in) () (cons (fn (car in) (mm (cdr in) (mm lst) (mymap invsqr (5 2 hello 9 1)* ERROR IN invsqr, (console)1.25 - (Argument 1) NUMBER expected(expt hello 2)1 ,i# =(lambda (x) (/ 1 (expt x 2)1 ,ex = hello1 ,b0 invsqr (console)1:25 (expt x 2)1 mm (console)6:17 (fn (car in)2 mm (console)6:31 (mm (cdr in)3 mm (console)6:31 (mm (cdr in)4 (interaction) (console)8:1 (mymap invsqr (5 2 hel.1 ,+1 mm (console)6:17 (fn (car in)11 (pp mm)(lambda (in) (if (null? in) () (cons (fn (car in) (mm (cdr in)11 ,ein = (hello 9 1)mm = (lambda (in) (if (null? in) () (cons (fn (car in) (mm (cdr in)fn = invsqrlst = (5 2 hello 9 1)11 ,(e mm)mm = (lambda (in) (if (null? in) () (cons (fn (car in) (mm (cdr in)fn = invsqrlst = (5 2 hello 9 1)11 fn#11 (pp fn)(lambda (x) (/ 1 (expt x 2)11 ,+2 # (console)6.31 (mm (cdr in)12 ,ein = (2 hello 9 1)mm = (lambda (in) (if (null? in) () (cons (fn (car in) (mm (cdr in)fn = invsqrlst = (5 2 hello 9 1)12 ,(c (list 3 4 5)(1/25 1/4 3 4 5) ,q5.3 和调试相关的过程(help subject)(help-browser new-value) help过程用来显示Gambit内部的过程定义或宏定义。例如调用(help gensym)将显示gensym程序的定义文档部分,调用(help time)将显示time的宏定义。 (help time) 等同 ,(h time)help-browser过程用来指定外部用来显示帮助文档的外部应用程序的名字,默认为”lynx”。 例: (help-browser firefox) ; 用firefox代替lynx显示信息 (help gensym) (help gensym) ; OK 因为gensym是一个定义过程名 (help time) (help time) ; not OK 因为time是一个宏定义* ERROR IN (console)5.7 - Macro name cant be used as a variable: time(repl-result-history-ref i)(repl-result-history-max-length-set! n) REPL保持最后几个历史计算结果。(repl-result-history-ref i) 返回倒数第i个计算结果(i从0开始)。默认情况下,只保持3个历史计算结果。可以通过调用(repl-result-history-max-length-set! n)来设定结果的最大保持数。n的取值范围在0到10之间。为了方便书写repl-result-history-ref的调用,这里提供了缩写形式。 #代表最后一个计算结果, #代表倒数第二个, 以此类推。例: (map (lambda (x) (* x x) (1 2 3)(1 4 9) (reverse #)(9 4 1) (append # #)(9 4 1 1 4 9) 11 11 (+ # #)2 (+ # #)3 (+ # #)5 #* ERROR IN (console)9.1 - (Argument 1) Out of range(story-ref 3)1 (trace proc)(untrace proc) trace过程用来跟踪指定的过程。当被跟踪的过程被调用,首先该过程和参数的信息被显示在一行中。 该行的竖线表示缩进,打括号后显示调用的方式。 当被跟踪的过程返回结果时,显示具有相同缩进深度,但不显示大于号。 untrace过程用来取消指定的被跟踪的过程。未指定参数时,取消所有被跟踪的过程。 例: (define (fact n) (if ( (trace fact) (fact 5)| (fact 5)| | (fact 4)| | | (fact 3)| | | | (fact 2)| | | | | (fact 1)| | | | | 1| | | | 2| | | 6| | 24| 120120 (trace -)* WARNING - Rebinding global variable - to an interpreted procedure (- 4 5)| (- 4 5)| -1-1 (define (fact-iter n r) (if ( (trace fact-iter) (fact-iter 5 1)| (fact-iter 5 1)| | (- 5 1)| | 4| (fact-iter 4 5)| | (- 4 1)| | 3| (fact-iter 3 20)| | (- 3 1)| | 2| (fact-iter 2 60)| | (- 2 1)| | 1| (fact-iter 1 120)| 120120 (trace)(# # #) (untrace) (fact 5)120(step)(step-level-set! level)step过程能够进入单步模式,它会启动一个内嵌的REPL。step过程自身进入单步模式并没有什么意义,所以通常是以(begin (step) expr) 的形式进入单步模式。 在单步模式下,step-level-set!过程用来设置单步的等级,进而更精细的控制单步的执行过程。等级的取值范围在0到7的整数。 0级,解释器忽略单步模式。 1级,单步最小单位为过程调用 2级,单步最小单位为宏定义和操作 3级,单步最小单位为lambda表达式和操作 4级,单步最小单位为自定义宏和操作 5级,单步最小单位为set!定义的宏和操作 6级,单步最小单位为变量引用和操作 7级,单步最小单位为常量引用和操作(默认级别)例: (define (fact n) (if ( (step-level-set! 1) (begin (step) (fact 5)* STOPPED IN (console)3.151 ,s| (fact 5)* STOPPED IN fact, (console)1.221 ,s| | ( ,s| | (- n 1)| | 4* STOPPED IN fact, (console)1.371 ,s| | (fact (- n 1)* STOPPED IN fact, (console)1.221 ,s| | | ( ,s| | | (- n 1)| | | 3* STOPPED IN fact, (console)1.371 ,l| | | (fact (- n 1)* STOPPED IN fact, (console)1.221 ,l| | (* n (fact (- n 1)| | 24* STOPPED IN fact, (console)1.321 ,l| (* n (fact (- n 1)| 120120(break proc)(unbreak proc)break过程用来为指定的过程设定断点。当一个设置了断点的过程被调用,会停止在断点上,并进入单步模式。未指定参数时,break过程将列出当前拥有断点的过程一览表。 unbreak过程用来移除指定过程的断点。未指定参数时,unbreak过程移除所有断点。 break和unbreak的返回值都为void对象。 编译后的过程只有当绑定到全局变量,才可以被设置断点。例: (define (double x) (+ x x) (define (triple y) (- (double (double y) y) (define (f z) (* (triple z) 10) (break double) (break -)* WARNING - Rebinding global variable - to an interpreted procedure (f 5)* STOPPED IN double, (console)1.211 ,b0 double (console)1:21 +1 triple (console)2:31 (double y)2 f (console)3:18 (triple z)3 (interaction) (console)6:1 (f 5)1 ,ex = 51 ,c* STOPPED IN double, (console)1.211 ,c* STOPPED IN f, (console)3.291 ,c150 (break)(# #) (unbreak) (f 5)150(generate-proper-tail-calls new-value)注意: 这个过程在将来的版本中会被proper-tail-calls替代参数对象generate-proper-tail-calls被绑定到一个布尔值用来控制如何执行尾递归。当被绑定为#f,执行过程会将尾递归视为非尾递归来调用,这样的调用会产生新的续(continuation)。这个设定对调试很有用,因为一个函数标示的错误信号的位置信息,即使是它被尾递归调用,还是指向该函数被调用的层次位置。参数对象的初始值是#t,这意味着尾调用将重用调用函数的续(continuation)。 这个参数对象仅影响随后的处理。例: (generate-proper-tail-calls)#t (let loop (i 1) (if ( i 10) (loop (* i 2) oops)* ERROR IN #, (console)2.47 - Unbound variable: oops1 ,b0 # (console)2:47 oops1 (interaction) (console)2:1 (letrec (loop (lambda.1 ,t (generate-proper-tail-calls #f) (let loop (i 1) (if ( i 10) (loop (* i 2) oops)* ERROR IN #, (console)6.47 - Unbound variable: oops1 ,b0 # (console)6:47 oops1 # (console)6:32 (loop (* i 2)2 # (console)6:32 (loop (* i 2)3 # (console)6:32 (loop (* i 2)4 # (console)6:32 (loop (* i 2)5 (interaction) (console)6:1 (letrec (loop (lambda.(display-environment-set! display?)注意: 这个过程在将来的版本中会被参数对象repl-display-environment?替代 这个过程设置一个标志用来控制自动显示REPL的环境。如果display?为true,在REPL提示符之前显示环境。默认不显示环境。(repl-display-environment? display?)参数对象repl-display-environment?被绑定到一个布尔值用来控制自动显示REPL的环境 。如果display?为true,在R

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论