2015-01-11 27 views
5

Tôi đang cố gắng tìm ra cách để vượt qua mã trong sbcl và Slime sau khi gọi trình gỡ lỗi với một cái gì đó như phá vỡ. Tôi không muốn phải bắt đầu bước từ đầu. Ví dụ: nếu tôi có mã sau:Bước vào sbcl từ bên trong trình gỡ lỗi

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

Sau khi điểm ngắt được nhấn, tôi muốn có thể bắt đầu bước qua mã. Cách duy nhất tôi đã tìm thấy để làm điều này, là đi qua khung trong Slime, sử dụng tính năng "Return From Frame" (R), và gõ vào (bước (fib 2)).

Khi tôi cố gắng sử dụng "Bước" (s) tính năng, thay vì thực sự bước, tôi cho điều này:

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

Những gì tôi đang tìm kiếm nên có thể. Từ hướng dẫn sbcl bước

có thể được gọi thông qua step vĩ mô, hoặc từ bên trong trình gỡ lỗi.

Tôi đang chạy sbcl 1.2.5 với Slime 2.12 và chất lượng tối ưu của tôi là tất cả 1 trừ cho sự an toàn và gỡ lỗi đó đều phô trương 3.

+1

Điều này thực sự nằm ngoài ngữ cảnh ở đây, có vẻ như lỗi hoặc yêu cầu hỗ trợ. Bạn đã thử hỏi trong kênh #lisp IRC ở freenode hoặc danh sách gửi thư của SLIME chưa? Nó không có vẻ trực tiếp về SBCL, vì dường như bạn đã thử bước vào nó mà không có SLIME. – acelent

Trả lời

1

tôi đã biên soạn với debug thiết lập để 3. Bởi vì điều này , khi tôi sẽ bước sau giờ nghỉ, nó sẽ bước vào vung, đưa ra hành vi kỳ lạ được mô tả.

1

Tôi đã phải vật lộn với việc cố gắng thực hiện công việc gỡ lỗi từng bước kể từ khi tôi bắt đầu học lisp chung. Sau khi đọc hướng dẫn tuyệt đẹp này debugging with slime Tôi đã nghĩ đến việc cho trình gỡ rối bước một cơ hội khác ... Đây là những gì tôi đã làm để biên dịch lại swank (đọc cho đến khi kết thúc trước khi thử bản thân):

Bắt đầu phiên sbcl mới trong thiết bị đầu cuối:

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 

mà không làm việc, vì vậy tôi đã đi cho cách tiếp cận khác, tôi đã thêm này để swank.lisp:

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

: Khởi động lại chất nhờn, nó biên dịch lại một vài tập tin, và sau đó nó làm việc như mong đợi.

(lưu ý rằng trước khi thực hiện ở trên, tôi cũng đã thay đổi

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

trong phô trương/sbcl.lisp, nhưng sự thay đổi này đã không ảnh hưởng đến vấn đề bước gỡ lỗi) (Tôi cũng đã cố gắng để thiết lập (declaim (optimize (debug 0))) trong .sbclrc và sau đó khởi động lại chất nhờn nhưng như xa như tôi có thể nhớ, điều đó không làm việc)

cập nhật:.

"Sau poin nghỉ t là hit, tôi muốn để có thể bắt đầu bước thông qua mã. Cách duy nhất tôi đã tìm thấy để làm điều này, là để đi qua khung trong Slime, sử dụng "Return Từ Frame" (R) tính năng, và gõ trong (bước (fib 2))."

Bạn thực sự có thể tiến hành trực tiếp bằng cách nhấn s!Không cần phải trả lại từ Frame, chỉ cần nhấn s sau khi nghỉ giải lao. Lưu ý rằng để làm việc, bạn phải có (declaim (optimize (debug 3))) trong tệp khởi tạo của bạn (ví dụ: .bbrc)

Các vấn đề liên quan