Gambit 5.調(diào)試.doc_第1頁
Gambit 5.調(diào)試.doc_第2頁
Gambit 5.調(diào)試.doc_第3頁
Gambit 5.調(diào)試.doc_第4頁
Gambit 5.調(diào)試.doc_第5頁
已閱讀5頁,還剩6頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

Gambit 5.調(diào)試表達(dá)式的執(zhí)行可能因?yàn)橄铝性蚨V? 1. 運(yùn)算錯誤,比如除0。 2. 用戶中斷運(yùn)算 (通常是通過輸入)。 3. 停在斷點(diǎn)上等。 4. 單步模式被啟動。當(dāng)運(yùn)算被停止,一個內(nèi)嵌REPL在運(yùn)行上下文中被啟動。5.1 調(diào)試命令,? 顯示內(nèi)嵌REPL命令(逗號命令形式)的概要。,h 顯示最后的執(zhí)行錯誤。,(h xxx) 顯示名為xxx的過程定義或宏定義。 例: ,(h time)將顯示time的幫助內(nèi)容。,q 終止Gambit進(jìn)程,狀態(tài)值為0。相當(dāng)于調(diào)用(exit 0),qt 終止當(dāng)前線程(若為主線程,則為終止Gambit進(jìn)程)。,t 退回到頂層REPL。,d 退回到上一層REPL。,c 在離開當(dāng)前REPL之前,繼續(xù)當(dāng)前的執(zhí)行。這個命令只能用在被用戶中斷,斷點(diǎn)停止,或單步執(zhí)行的情況下。,(c expr) 在離開當(dāng)前REPL之前,將expr的結(jié)果賦給被提示未綁定數(shù)據(jù)的變量或出錯的位置,并繼續(xù)處理當(dāng)前運(yùn)算。 例如: 如果表達(dá)式(* (/ x y) 2)因y是0而報錯, 那么在當(dāng)前的REPL輸入命令,(c 4) , (* (/ x y) 2) 表達(dá)式中的(/ x y)的結(jié)果被賦予4這個值(注意: 不是給y賦值,而是出錯的表達(dá)式),繼續(xù)表達(dá)式的運(yùn)算。執(zhí)行這個命令時,要注意數(shù)據(jù)的類型。對于上面的例子,如果輸入命令,(c #f)將會導(dǎo)致*錯誤。,s 在離開當(dāng)前REPL之前,繼續(xù)當(dāng)前單步模式的執(zhí)行。這個命令只能用在被用戶中斷,斷點(diǎn)停止,或單步執(zhí)行的情況下。,l 這個命令有點(diǎn)像,s。當(dāng)程序調(diào)用返回,或者當(dāng)被調(diào)用過程的執(zhí)行遇到斷點(diǎn)時將恢復(fù)到單步運(yùn)行模式。,N 移動到N號幀。改變當(dāng)前幀之后,顯示該幀的一行摘要,如同,y命令。,N+ 向前移動N個幀。改變當(dāng)前幀之后,顯示該幀的一行摘要,如同,y命令。,N- 向后移動N個幀。改變當(dāng)前幀之后,顯示該幀的一行摘要,如同,y命令。,+ 等同于,1+。,- 等同于,1-。,+ 等同于,N+,其中N是在回溯的頭部顯示的幀數(shù)。, 等同于,N-,其中N是在回溯的頭部顯示的幀數(shù)。,y 顯示一行當(dāng)前幀的摘要,以四個字段的形式顯示。第一個字段是幀號, 第二個字段是創(chuàng)建該幀的過程或REPL。其余的字段用來描述幀相關(guān)的子問題,第三字段是子問題的源代碼的位置和第四場是源代碼,可能被截斷以適應(yīng)該行顯示。如果該信息不足,最后兩個字段可能不被顯示。,b 從當(dāng)前幀開始,顯示回溯中的每一幀概述。若超過15幀,中間的幀有些會被忽略顯示。,be 和,b相同,但是也顯示環(huán)境。,bed 和,be相同,但是也顯示動態(tài)環(huán)境。,(b X) 從第X幀開始,顯示回溯中的每一幀概述。,(be X) 和,(b expr)相同,但是也顯示環(huán)境。,(bed X) 和,(be expr)相同,但是也顯示動態(tài)環(huán)境。,i 顯示當(dāng)前幀的過程。,e 顯示當(dāng)前幀可訪問的環(huán)境。 詞法變量的綁定被顯示為如下格式: variable = expression(當(dāng)變量是可變的) variable = expression(當(dāng)變量是不可變的,它可以在編譯時優(yōu)化) 動態(tài)綁定參數(shù)被顯示為如下格式: (parameter) = expression,ed 和,e相同,但是動態(tài)環(huán)境總是被顯示。,(e X) 顯示第X幀可訪問的環(huán)境。,(ed X) 和,(e X)相同,但是動態(tài)環(huán)境總是被顯示。,st 顯示當(dāng)前線程組中線程的狀態(tài)。一個線程的狀態(tài)可以是:未初始化,初始化,活躍,和終止(正?;虍惓#??;顒泳€程可以運(yùn)行,休眠,等待同步對象(互斥體,條件變量或端口)也可能會超時。,(st expr) 顯示特定的線程或線程組的狀態(tài)。 expr的值必須是一個線程或線程組。,(v expr) 開始新的REPL來訪expr的值X,X在當(dāng)前幀執(zhí)行expr獲得。5.2 調(diào)試?yán)? 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 和調(diào)試相關(guān)的過程(help subject)(help-browser new-value) help過程用來顯示Gambit內(nèi)部的過程定義或宏定義。例如調(diào)用(help gensym)將顯示gensym程序的定義文檔部分,調(diào)用(help time)將顯示time的宏定義。 (help time) 等同 ,(h time)help-browser過程用來指定外部用來顯示幫助文檔的外部應(yīng)用程序的名字,默認(rèn)為”lynx”。 例: (help-browser firefox) ; 用firefox代替lynx顯示信息 (help gensym) (help gensym) ; OK 因?yàn)間ensym是一個定義過程名 (help time) (help time) ; not OK 因?yàn)閠ime是一個宏定義* 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保持最后幾個歷史計算結(jié)果。(repl-result-history-ref i) 返回倒數(shù)第i個計算結(jié)果(i從0開始)。默認(rèn)情況下,只保持3個歷史計算結(jié)果??梢酝ㄟ^調(diào)用(repl-result-history-max-length-set! n)來設(shè)定結(jié)果的最大保持?jǐn)?shù)。n的取值范圍在0到10之間。為了方便書寫repl-result-history-ref的調(diào)用,這里提供了縮寫形式。 #代表最后一個計算結(jié)果, #代表倒數(shù)第二個, 以此類推。例: (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過程用來跟蹤指定的過程。當(dāng)被跟蹤的過程被調(diào)用,首先該過程和參數(shù)的信息被顯示在一行中。 該行的豎線表示縮進(jìn),打括號后顯示調(diào)用的方式。 當(dāng)被跟蹤的過程返回結(jié)果時,顯示具有相同縮進(jìn)深度,但不顯示大于號。 untrace過程用來取消指定的被跟蹤的過程。未指定參數(shù)時,取消所有被跟蹤的過程。 例: (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過程能夠進(jìn)入單步模式,它會啟動一個內(nèi)嵌的REPL。step過程自身進(jìn)入單步模式并沒有什么意義,所以通常是以(begin (step) expr) 的形式進(jìn)入單步模式。 在單步模式下,step-level-set!過程用來設(shè)置單步的等級,進(jìn)而更精細(xì)的控制單步的執(zhí)行過程。等級的取值范圍在0到7的整數(shù)。 0級,解釋器忽略單步模式。 1級,單步最小單位為過程調(diào)用 2級,單步最小單位為宏定義和操作 3級,單步最小單位為lambda表達(dá)式和操作 4級,單步最小單位為自定義宏和操作 5級,單步最小單位為set!定義的宏和操作 6級,單步最小單位為變量引用和操作 7級,單步最小單位為常量引用和操作(默認(rèn)級別)例: (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過程用來為指定的過程設(shè)定斷點(diǎn)。當(dāng)一個設(shè)置了斷點(diǎn)的過程被調(diào)用,會停止在斷點(diǎn)上,并進(jìn)入單步模式。未指定參數(shù)時,break過程將列出當(dāng)前擁有斷點(diǎn)的過程一覽表。 unbreak過程用來移除指定過程的斷點(diǎn)。未指定參數(shù)時,unbreak過程移除所有斷點(diǎn)。 break和unbreak的返回值都為void對象。 編譯后的過程只有當(dāng)綁定到全局變量,才可以被設(shè)置斷點(diǎn)。例: (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替代參數(shù)對象generate-proper-tail-calls被綁定到一個布爾值用來控制如何執(zhí)行尾遞歸。當(dāng)被綁定為#f,執(zhí)行過程會將尾遞歸視為非尾遞歸來調(diào)用,這樣的調(diào)用會產(chǎn)生新的續(xù)(continuation)。這個設(shè)定對調(diào)試很有用,因?yàn)橐粋€函數(shù)標(biāo)示的錯誤信號的位置信息,即使是它被尾遞歸調(diào)用,還是指向該函數(shù)被調(diào)用的層次位置。參數(shù)對象的初始值是#t,這意味著尾調(diào)用將重用調(diào)用函數(shù)的續(xù)(continuation)。 這個參數(shù)對象僅影響隨后的處理。例: (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?)注意: 這個過程在將來的版本中會被參數(shù)對象repl-display-environment?替代 這個過程設(shè)置一個標(biāo)志用來控制自動顯示REPL的環(huán)境。如果display?為true,在REPL提示符之前顯示環(huán)境。默認(rèn)不顯示環(huán)境。(repl-display-environment? display?)參數(shù)對象repl-display-environment?被綁定到一個布爾值用來控制自動顯示REPL的環(huán)境 。如果display?為true,在R

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論