Gambit 5调试.docx
- 文档编号:16115353
- 上传时间:2023-07-10
- 格式:DOCX
- 页数:16
- 大小:19.65KB
Gambit 5调试.docx
《Gambit 5调试.docx》由会员分享,可在线阅读,更多相关《Gambit 5调试.docx(16页珍藏版)》请在冰点文库上搜索。
Gambit5调试
Gambit5.调试
表达式的执行可能因为下列原因而停止:
1.运算错误,比如除0。
2.用户中断运算(通常是通过输入<^C>)。
3.停在断点上等。
4.单步模式被启动。
当运算被停止,一个内嵌REPL在运行上下文中被启动。
5.1调试命令
?
显示内嵌REPL命令(逗号命令形式)的概要。
h
显示最后的执行错误。
(hxxx)
显示名为xxx的过程定义或宏定义。
例:
‘,(htime)’将显示time的帮助内容。
q
终止Gambit进程,状态值为0。
相当于调用(exit0)
qt
终止当前线程(若为主线程,则为终止Gambit进程)。
t
退回到顶层REPL。
d
退回到上一层REPL。
c
在离开当前REPL之前,继续当前的执行。
这个命令只能用在被用户中断,断点停止,或单步执行的情况下。
(cexpr)
在离开当前REPL之前,将expr的结果赋给被提示未绑定数据的变量或出错的位置,并继续处理当前运算。
例如:
如果表达式’(*(/xy)2)’因’y’是0而报错,那么在当前的REPL输入命令’,(c4)’,’(*(/xy)2)’表达式中的’(/xy)’的结果被赋予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相同,但是也显示动态环境。
(bX)
从第X帧开始,显示回溯中的每一帧概述。
(beX)
和,(bexpr)相同,但是也显示环境。
(bedX)
和,(beexpr)相同,但是也显示动态环境。
i
显示当前帧的过程。
e
显示当前帧可访问的环境。
词法变量的绑定被显示为如下格式:
‘variable=expression’(当变量是可变的)
‘variable==expression’(当变量是不可变的,它可以在编译时优化)
动态绑定参数被显示为如下格式:
‘(parameter)=expression’
ed
和,e相同,但是动态环境总是被显示。
(eX)
显示第X帧可访问的环境。
(edX)
和,(eX)相同,但是动态环境总是被显示。
st
显示当前线程组中线程的状态。
一个线程的状态可以是:
未初始化,初始化,活跃,和终止(正常或异常)。
活动线程可以运行,休眠,等待同步对象(互斥体,条件变量或端口)也可能会超时。
(stexpr)
显示特定的线程或线程组的状态。
expr的值必须是一个线程或线程组。
(vexpr)
开始新的REPL来访expr的值X,X在当前帧执行expr获得。
5.2调试例子
$gsi
Gambitv4.8.5
>(define(invsqrx)(/1(exptx2)))
>(define(mymapfnlst)
(define(mmin)
(if(null?
in)
'()
(cons(fn(carin))(mm(cdrin)))))
(mmlst))
>(mymapinvsqr'(52hello91))
***ERRORINinvsqr,(console)@1.25--(Argument1)NUMBERexpected
(expt'hello2)
1>,i
#
(lambda(x)(/1(exptx2)))
1>,e
x='hello
1>,b
0invsqr(console)@1:
25(exptx2)
1mm(console)@6:
17(fn(carin))
2mm(console)@6:
31(mm(cdrin))
3mm(console)@6:
31(mm(cdrin))
4(interaction)(console)@8:
1(mymapinvsqr'(52hel...
1>,+
1mm(console)@6:
17(fn(carin))
1\1>(ppmm)
(lambda(in)(if(null?
in)'()(cons(fn(carin))(mm(cdrin)))))
1\1>,e
in='(hello91)
mm=(lambda(in)(if(null?
in)'()(cons(fn(carin))(mm(cdrin)))))
fn=invsqr
lst='(52hello91)
1\1>,(emm)
mm=(lambda(in)(if(null?
in)'()(cons(fn(carin))(mm(cdrin)))))
fn=invsqr
lst='(52hello91)
1\1>fn
#
1\1>(ppfn)
(lambda(x)(/1(exptx2)))
1\1>,+
2#
1\2>,e
in='(2hello91)
mm=(lambda(in)(if(null?
in)'()(cons(fn(carin))(mm(cdrin)))))
fn=invsqr
lst='(52hello91)
1\2>,(c(list345))
(1/251/4345)
Ø,q
5.3和调试相关的过程
(helpsubject)
(help-browser[new-value])
help过程用来显示Gambit内部的过程定义或宏定义。
例如调用(helpgensym)将显示gensym程序的定义文档部分,调用(help‘time)将显示time的宏定义。
(help‘time)等同,(htime)
help-browser过程用来指定外部用来显示帮助文档的外部应用程序的名字,默认为”lynx”。
例:
>(help-browser"firefox");用firefox代替lynx显示信息
>(help'gensym)
>(helpgensym);OK因为gensym是一个定义过程名
>(help'time)
>(helptime);notOK因为time是一个宏定义
***ERRORIN(console)@5.7--Macronamecan'tbeusedasavariable:
time
(repl-result-history-refi)
(repl-result-history-max-length-set!
n)
REPL保持最后几个历史计算结果。
(repl-result-history-refi)返回倒数第i个计算结果(i从0开始)。
默认情况下,只保持3个历史计算结果。
可以通过调用(repl-result-history-max-length-set!
n)来设定结果的最大保持数。
n的取值范围在0到10之间。
为了方便书写repl-result-history-ref的调用,这里提供了缩写形式。
‘#’代表最后一个计算结果,‘##’代表倒数第二个,以此类推。
例:
>(map(lambda(x)(*xx))'(123))
(149)
>(reverse#)
(941)
>(append###)
(941149)
>1
1
>1
1
>(+###)
2
>(+###)
3
>(+###)
5
>####
***ERRORIN(console)@9.1--(Argument1)Outofrange
(repl-result-story-ref3)
1>
(traceproc…)
(untraceproc…)
trace过程用来跟踪指定的过程。
当被跟踪的过程被调用,首先该过程和参数的信息被显示在一行中。
该行的竖线表示缩进,打括号后显示调用的方式。
当被跟踪的过程返回结果时,显示具有相同缩进深度,但不显示大于号。
untrace过程用来取消指定的被跟踪的过程。
未指定参数时,取消所有被跟踪的过程。
例:
>(define(factn)(if( >(tracefact) >(fact5) |>(fact5) ||>(fact4) |||>(fact3) ||||>(fact2) |||||>(fact1) |||||1 ||||2 |||6 ||24 |120 120 >(trace-) ***WARNING--Rebindingglobalvariable"-"toaninterpretedprocedure >(-45) |>(-45) |-1 -1 >(define(fact-iternr)(if( >(tracefact-iter) >(fact-iter51) |>(fact-iter51) ||>(-51) ||4 |>(fact-iter45) ||>(-41) ||3 |>(fact-iter320) ||>(-31) ||2 |>(fact-iter260) ||>(-21) ||1 |>(fact-iter1120) |120 120 >(trace) (# >(untrace) >(fact5) 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(factn)(if( >(step-level-set! 1) >(begin(step)(fact5)) ***STOPPEDIN(console)@3.15 1>,s |>(fact5) ***STOPPEDINfact,(console)@1.22 1>,s ||>( ||#f ***STOPPEDINfact,(console)@1.43 1>,s ||>(-n1) ||4 ***STOPPEDINfact,(console)@1.37 1>,s ||>(fact(-n1)) ***STOPPEDINfact,(console)@1.22 1>,s |||>( |||#f ***STOPPEDINfact,(console)@1.43 1>,s |||>(-n1) |||3 ***STOPPEDINfact,(console)@1.37 1>,l |||>(fact(-n1)) ***STOPPEDINfact,(console)@1.22 1>,l ||>(*n(fact(-n1))) ||24 ***STOPPEDINfact,(console)@1.32 1>,l |>(*n(fact(-n1))) |120 120 (breakproc…) (unbreakproc…) break过程用来为指定的过程设定断点。 当一个设置了断点的过程被调用,会停止在断点上,并进入单步模式。 未指定参数时,break过程将列出当前拥有断点的过程一览表。 unbreak过程用来移除指定过程的断点。 未指定参数时,unbreak过程移除所有断点。 break和unbreak的返回值都为void对象。 编译后的过程只有当绑定到全局变量,才可以被设置断点。 例: >(define(doublex)(+xx)) >(define(tripley)(-(double(doubley))y)) >(define(fz)(*(triplez)10)) >(breakdouble) >(break-) ***WARNING--Rebindingglobalvariable"-"toaninterpretedprocedure >(f5) ***STOPPEDINdouble,(console)@1.21 1>,b 0double(console)@1: 21+ 1triple(console)@2: 31(doubley) 2f(console)@3: 18(triplez) 3(interaction)(console)@6: 1(f5) 1>,e x=5 1>,c ***STOPPEDINdouble,(console)@1.21 1>,c ***STOPPEDINf,(console)@3.29 1>,c 150 >(break) (# >(unbreak) >(f5) 150 (generate-proper-tail-calls[new-value]) [注意: 这个过程在将来的版本中会被’proper-tail-calls’替代] 参数对象generate-proper-tail-calls被绑定到一个布尔值用来控制如何执行尾递归。 当被绑定为#f,执行过程会将尾递归视为非尾递归来调用,这样的调用会产生新的续(continuation)。 这个设定对调试很有用,因为一个函数标示的错误信号的位置信息,即使是它被尾递归调用,还是指向该函数被调用的层次位置。 参数对象的初始值是#t,这意味着尾调用将重用调用函数的续(continuation)。 这个参数对象仅影响随后的处理。 例: >(generate-proper-tail-calls) #t >(letloop((i1))(if( ***ERRORIN# oops 1>,b 0# 47oops 1(interaction)(console)@2: 1((letrec((loop(lambda... 1>,t >(generate-proper-tail-calls#f) >(letloop((i1))(if( ***ERRORIN# oops 1>,b 0# 47oops 1# 32(loop(*i2)) 2# 32(loop(*i2)) 3# 32(loop(*i2)) 4# 32(loop(*i2)) 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,在REPL提示符之前显示环境。 这个设置在单步模式中特别有用。 默认不显示环境。 (display-dynamic-environment? display? ) 参数对象display-dynamic-environment? 被绑定到一个布尔值用来控制在显示环境时,是否显示动态环境。 默认不显示动态环境。 (pretty-printobj[port]) pretty-prints过程打印obj到指定的端口上。 若未指定,端口默认为当前输出端口。 例: >(pretty-print (let*((x'(1234))(y(listxxx)))(listyyy))) (((1234)(1234)(1234)) ((1234)(1234)(1234)) ((1234)(1234)(1234))) (ppobj[port]) 调用pretty-prints过程打印obj到指定的端口上。 若obj是解释器创建的过程,或在编译时被定义了’debug-source’的过程,该过程的代码会被显示。 若未指定,端口默认为当前输出端口。 例: >(define(fg)(+(time(g100))(time(g1000)))) >(ppf) (lambda(g) (+(##time(lambda()(g100))'(g100)) (##time(lambda()(g1000))'(g1000)))) (gc-report-set! report? ) 该过程中的控制报告垃圾收集的世代。 如果参数为true,则每次垃圾回收后都会产生内存使用情况的简要报告。 内容包括: 采取这种垃圾收集的时间,从程序启动开始申请的MB数,堆内存占用的MB数,堆内存占用的比例,占用的可移动和不可移动对象的字节数。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Gambit 5调试 调试
![提示](https://static.bingdoc.com/images/bang_tan.gif)