2015-01-11 23 views
5

我想弄清楚如何通過sbcl和Slime中的代碼調用類似break之類的調試器之後的代碼。我不想從一開始就開始邁步。例如,如果我有以下代碼:破發點被擊中從調試器中進入sbcl

(defun fib (n) 
    (when (eql n 2) 
    (break)) 
    (if (<= 0 n 1) 
     n 
     (+ (fib (- n 1)) 
     (fib (- n 2))))) 

後,我希望能夠開始逐步執​​行代碼。我發現要做到這一點的唯一方法就是在Slime中使用「Return From Frame」(R)特徵,並輸入(step(fib 2))。

當我嘗試使用「步驟」(一個或多個)功能,而不是實際踏步,我給這樣的:

Evaluating call: 
    (CONTINUE) 
With arguments: 
    [Condition of type STEP-FORM-CONDITION] 

Restarts: 
0: [STEP-CONTINUE] Resume normal execution 
1: [STEP-OUT] Resume stepping after returning from this function 
2: [STEP-NEXT] Step over call 
3: [STEP-INTO] Step into call 
4: [ABORT] Return to sldb level 1. 
5: [CONTINUE] Return from BREAK. 
--more-- 

Backtrace: 
    0: (SWANK:SLDB-STEP 0) 
    1: (SB-INT:SIMPLE-EVAL-IN-LEXENV (SWANK:SLDB-STEP 0) #<NULL-LEXENV>) 
    2: (EVAL (SWANK:SLDB-STEP 0)) 
    3: (SWANK:EVAL-FOR-EMACS (SWANK:SLDB-STEP 0) "COMMON-LISP-USER" 122) 
    4: ((FLET #:FORM-FUN-7055 :IN SWANK::SLDB-LOOP)) 
    5: (SWANK::SLDB-LOOP 1) 
    6: ((LAMBDA NIL :IN SWANK::DEBUG-IN-EMACS)) 
    7: ((FLET SWANK/BACKEND:CALL-WITH-DEBUGGING-ENVIRONMENT :IN "/home/michael/slime/swank/sbcl.lisp") #<FUNCTION (LAMBDA NIL :IN SWANK::DEBUG-IN-EMACS) {1003DB44CB}>) 

我所尋找的應該是可能的。從SBCL手動舞步

能夠經由step宏或從調試器內被調用。

我運行SBCL 1.2.5煤泥2.12和我的優化素質都是1,除了安全和調試這兩者都是3

+1

這實際上超出了上下文,聽起來像是一個錯誤或支持請求。你有沒有試過在freenode或SLIME郵件列表的IRC#lisp頻道詢問?它似乎並不直接關於SBCL,因爲它似乎並沒有嘗試在沒有SLIME的情況下加入它。 – acelent

回答

1

我編過斯旺克與調試設置爲3。正因爲如此,當我在突破之後繼續前進時,它會步入不快的狀態,從而描述出奇怪的行爲。

1

自從我開始學習通用lisp以來,我一直在努力嘗試進行步驟調試工作。閱讀這個美麗的教程debugging with slime後,我想過放棄步調試一次機會...... 這就是我所做的重新編譯斯旺克(試圖自己之前一直讀到結尾):

開始在終端新SBCL會話:

rlwrap sbcl 
ran the following 
(declaim (optimize (debug 0))) 
(asdf:load-system :swank :force t) 
; then i noticed in the messages that it doesn't compile all the files 
; compiling file "/home/smokeink/quicklisp/dists/quicklisp/software/slime-2.14/swank-loader.lisp" 
; /home/smokeink/.cache/common-lisp/sbcl-1.3.0-linux-x64/home/smokeink/quicklisp/dists/quicklisp/software/slime-2.14/swank-loader-TMP.fasl written 
; then i tried: 
(compile-file "~/.emacs.d/elpa/slime-20150623.821/swank.lisp") 
; compiling... 
; ~/.emacs.d/elpa/slime-20150623.821/swank.fasl written 

,沒有工作,所以我去了另一種方法,我已將此添加swank.lisp:

; ... 
(in-package :swank) 
; added the following line 
(declaim (optimize (debug 0))) 
; ... 

重啓動煤泥,它重新編譯幾個文件,然後將其發揮預期。

(請注意,上述前,我也變了

(declaim (optimize (debug 2) 
        (sb-c::insert-step-conditions 0) 
        (sb-c::insert-debug-catch 0))) 
to 
(declaim (optimize (debug 0) 
        (sb-c::insert-step-conditions 0) 
        (sb-c::insert-debug-catch 0))) 
在斯萬克/ sbcl.lisp

, 但這種變化對步調試問題沒有影響) (我也嘗試過設置(declaim (optimize (debug 0)))在.sbclrc,然後重新啓動煤泥,但據我的記憶,沒有工作)

更新:

「破POIN後噸被擊中,我希望能夠通過代碼開始步進 。我發現這樣做的唯一方法,就是去了 在煤泥框架,使用「返回由Frame」(R)功能,並輸入 (步驟(FIB 2))。」

您實際上可以按s直接進行!無需從框架返回,只需在休息發生後按s即可。請注意,爲了達到這個目的,您的初始化文件中必須有(declaim (optimize (debug 3)))(例如.sbclrc)