2015-01-11 32 views
5

Sto cercando di capire come passare attraverso il codice in sbcl e Slime dopo aver richiamato il debugger con qualcosa come break. Non voglio dover iniziare a fare un passo dall'inizio. Per esempio, se ho il seguente codice:Stepping in sbcl dall'interno del debugger

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

Dopo il punto di rottura è colpito, voglio essere in grado di avviare un passo attraverso il codice. L'unico modo che ho trovato per fare questo, è di andare oltre il frame in Slime, utilizzare la funzione "Return From Frame" (R) e digitare (step (fib 2)).

Quando provo ad utilizzare la (s) funzione "Passo", invece di fare un passo in realtà, mi viene data questa:

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}>) 

Quello che sto cercando dovrebbe essere possibile. Dal manuale sbcl passo

può essere invocata tramite step macro o dentro il debugger.

Sto facendo funzionare SBCL 1.2.5 con Slime 2.12 e le mie qualità di ottimizzazione sono tutti 1 tranne che per la sicurezza e il debug che sono entrambi Swank 3.

+1

Questo è davvero fuori contesto qui, sembra un bug o una richiesta di supporto. Hai provato a chiedere nel canale #lisp dell'IRC su freenode o sulla mailing list di SLIME? Non sembra direttamente su SBCL, in quanto non sembra che tu abbia provato a farlo senza SLIME. – acelent

risposta

1

avevo compilato con il debug impostato su 3. A causa di questo , quando avrei fatto un passo dopo l'intervallo, sarebbe poi passato in una direzione, dando il comportamento strano descritto.

1

Ho avuto difficoltà nel provare a eseguire il debugging dei passaggi da quando ho iniziato ad apprendere il linguaggio comune. Dopo aver letto questo bellissimo tutorial di debugging with slime ho pensato di dare il debugger passo un'altra possibilità ... Questo è quello che ho fatto per ricompilare Swank (leggi fino alla fine prima di provare voi stessi):

iniziare una nuova sessione SBCL in un terminale:

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 

che non ha funzionato, così sono andato per un altro approccio, ho aggiunto questo per swank.lisp:

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

Restarted melma, è ricompilato alcuni file, e poi ha funzionato come previsto.

(si noti che prima di fare quanto sopra, avevo anche cambiato

(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))) 

in Swank/sbcl.lisp, ma questo cambiamento non ha avuto effetto sul problema step-debug) (avevo anche provato per impostare (declaim (optimize (debug 0))) in .sbclrc e poi riavviare melma ma per quanto posso ricordare, che non ha funzionato)

Aggiornamento:.

"Dopo la pausa poin t è colpito, voglio essere in grado di iniziare a calpestare attraverso il codice. L'unico modo che ho trovato per fare questo, è quello di superare telaio in Slime, usi "ritorno Frame" feature (R), e digitare in (stadio (fib 2))."

Si può effettivamente procedere direttamente premendo s!Non è necessario tornare da Frame, basta premere s dopo l'interruzione. Nota che per farlo devi avere (declaim (optimize (debug 3))) nel tuo file di inizializzazione (es. .sbclrc)