2015-01-11 5 views
5

break와 같은 디버거를 호출 한 후 sbcl 및 Slime에서 코드를 단계별로 실행하는 방법을 알아 내려고하고 있습니다. 나는 처음부터 발걸음을 시작하지 않으려합니다. 예를 들어, 다음 코드가있는 경우 :디버거 내에서 sbcl을 실행하십시오.

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

중단 점이 발생한 후 코드를 단계별로 실행할 수 있기를 원합니다. 내가 이것을 발견 한 유일한 방법은 슬라임의 프레임 위로 이동하여 "프레임에서 돌아 가기"(R) 기능을 사용하고 입력 (단계 (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, 또는 를 통해 호출 할 수 있습니다.

나는 점액 2.12 내 최적화 자질 SBCL 1.2.5을 실행하고는이 때문에 3으로 설정 디버그와 모두 3

+1

이것은 실제 상황에서 벗어났습니다. 버그 또는 지원 요청과 같은 것 같습니다. IRC#lisp 채널에서 freenode 또는 SLIME의 메일 링리스트에서 묻는 시도를 했습니까? 그것은 SBCL에 대해 직접적으로 보이지 않습니다. SLIME 없이는 단계적으로 시도하지 않은 것처럼 보입니다. – acelent

답변

1

내가 컴파일 한 허풍있는 안전 및 디버깅을 제외한 모든 1 , 내가 휴식을 취한 후 단계를 밟을 때, 그때는 기발한 행동을 묘사하면서, 허풍에 빠져 들었습니다.

1

나는 일반적인 lisp을 배우기 시작한 이래로 디버깅 작업을 단계별로 만들려고 애써왔다.

터미널에서 새로운 SBCL 세션을 시작 :이 아름다운 튜토리얼 debugging with slime을 읽은 후 나는 ... 이 (자신을 시도하기 전에 끝날 때까지 읽기) 내가 허풍을 다시 컴파일 한 것입니다 단계 디버거에게 또 다른 기회를주는 생각 : 작동하지 않았다

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))) 
; ... 

재시작하는 점액, 그것은 몇 개의 파일을 컴파일, 예상대로 그것은했다.

는 (나는 또한 시도했다 (I는 또한

스웽크/sbcl.lisp에서
(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))) 

, 을 변경했다, 위의 작업을 수행하기 전에 점에 유의 그러나이 변화는 스텝 디버깅 문제에 영향을 미치지 않음) .sbclrc에 (declaim (optimize (debug 0)))을 설정 한 후 점액을 다시 시작하지만, 지금까지 내가 기억하는 한, 문제가 해결되지 않았다)

업데이트하려면.

"브레이크 poin 후 t가 맞으면 코드를 통해 스테핑을 시작할 수 있기를 원합니다. 내가이 일을 발견하는 유일한 방법은, (FIB (2) 단계), 점액의 프레임을 통해 이동 "프레임에서 복귀"를 사용하기 (R) 기능, 그리고에서 을 입력합니다. "

실제로 직접 s를 눌러 진행할 수 있습니다!프레임에서 돌아갈 필요가 없습니다. 중단이 발생한 후 s를 누르기 만하면됩니다. 초기화 파일 (예 : .sbclrc)에 (declaim (optimize (debug 3)))이 있어야 함을 유의하십시오.

관련 문제