I am having trouble expanding frames to see local variables in SLDB using SLIME in XEmacs 21.4.13 with CLISP 2.33.1 on Cygwin. If I define a function with a break expression,
(defun foo (n) (break) n)
then call that function,
(foo 1)
SLDB presents the backtrace:
,---- | Break | [Condition of type SIMPLE-CONDITION] | | Restarts: | 0: [CONTINUE] Return from BREAK loop | 1: [ABORT] Abort handling SLIME request. | | Backtrace: | 0: frame binding variables (~ = dynamically): | | ~ SYSTEM::*FASOUTPUT-STREAM* <--> NIL | 1: EVAL frame for form (BREAK) | 2: EVAL frame for form (PROGN (BREAK) N) | 3: APPLY frame for call (FOO '1) | 4: EVAL frame for form (FOO 1) | 5: EVAL frame for form (SWANK:INTERACTIVE-EVAL "(foo 1)") | 6: EVAL frame for form (SWANK:START-SERVER "/tmp/seh/slime.800" :EXTERNAL-FORMAT :ISO-LATIN-1-UNIX) `----
Moving the cursor down to, say, the "1:" line and pressing enter to expand the frame causes XEmacs to hang. The minibuffer reports:
; pipelined request... (swank:frame-locals-for-emacs 1)
Interrupting XEmacs with C-g produces the following backtrace:
Debugger entered--Lisp error: (quit) accept-process-output(nil 0 10000) (while t (accept-process-output nil 0 10000)) (let ((debug-on-quit t) (inhibit-quit nil)) (while t (accept-process-output nil 0 10000))) (catch tag (slime-rex (tag sexp) (sexp package) (... ... ...) (... ...)) (let (... ...) (while t ...))) (apply (function funcall) (catch tag (slime-rex ... ... ... ...) (let ... ...))) (let* ((tag ...) (slime-stack-eval-tags ...)) (apply (function funcall) (catch tag ... ...))) slime-eval((swank:frame-locals-for-emacs 1)) sldb-frame-locals(1) (let* ((i 0) (G43782 ...) (var nil)) (while (consp G43782) (setq var ...) (destructuring-bind ... var ... ...) (setq i ...) (setq G43782 ...)) nil) (catch (quote --cl-block-nil--) (let* (... ... ...) (while ... ... ... ... ...) nil)) (cl-block-wrapper (catch (quote --cl-block-nil--) (let* ... ... nil))) (block nil (let* (... ... ...) (while ... ... ... ... ...) nil)) (loop for i from 0 for var in (sldb-frame-locals frame) do (destructuring-bind (&key name id value) var (slime-propertize-region ... ... ... ...) (insert "\n"))) sldb-insert-locals(1 " ") (progn (sldb-insert-frame frame t) (insert indent1 (in-sldb-face section "Locals:") "\n") (sldb-insert-locals frame-number indent2) (when sldb-show-catch-tags (let ... ...)) (unless sldb-enable-styled-backtrace (terpri)) (point)) (prog1 (progn (sldb-insert-frame frame t) (insert indent1 ... "\n") (sldb-insert-locals frame-number indent2) (when sldb-show-catch-tags ...) (unless sldb-enable-styled-backtrace ...) (point)) (add-text-properties G43777 (point) (backquote ...))) (let ((G43777 ...)) (prog1 (progn ... ... ... ... ... ...) (add-text-properties G43777 ... ...))) (slime-propertize-region (backquote (frame ... details-visible-p t)) (sldb-insert-frame frame t) (insert indent1 (in-sldb-face section "Locals:") "\n") (sldb-insert-locals frame-number indent2) (when sldb-show-catch-tags (let ... ...)) (unless sldb-enable-styled-backtrace (terpri)) (point)) (let* ((props ...) (frame ...) (frame-number ...) (standard-output ...) (indent1 " ") (indent2 " ")) (delete-region start end) (slime-propertize-region (backquote ...) (sldb-insert-frame frame t) (insert indent1 ... "\n") (sldb-insert-locals frame-number indent2) (when sldb-show-catch-tags ...) (unless sldb-enable-styled-backtrace ...) (point))) (save-excursion (goto-char start) (let* (... ... ... ... ... ...) (delete-region start end) (slime-propertize-region ... ... ... ... ... ... ...))) (let* ((G43776 ...) (start ...) (end ...)) (save-excursion (goto-char start) (let* ... ... ...))) (multiple-value-bind (start end) (sldb-frame-region) (save-excursion (goto-char start) (let* ... ... ...))) sldb-show-frame-details() (if (or on (not ...)) (sldb-show-frame-details) (sldb-hide-frame-details)) (let ((inhibit-read-only t) (column ...)) (if (or on ...) (sldb-show-frame-details) (sldb-hide-frame-details)) (move-to-column column)) sldb-toggle-details() funcall(sldb-toggle-details) (if fn (funcall fn)) (let ((fn ...)) (if fn (funcall fn))) (lambda nil "Invoke the action at point." (interactive) (let (...) (if fn ...)))() call-interactively(sldb-default-action)
If I press "c" continue from that backtrace, focus returns to the SLDB buffer, from which I can still invoke restarts. That is, the Lisp connection is still alive and synchronized with SLIME.
Recent activity in the *slime-events* buffer is:
,---- | (:emacs-rex | (swank:interactive-eval "(foo 1)") | nil t 32) | (:debug 0 1 | ("Break" " [Condition of type SIMPLE-CONDITION]" nil nil) | (("CONTINUE" "Return from BREAK loop") | ("ABORT" "Abort handling SLIME request.")) | ((0 "frame binding variables (~ = dynamically):\n | ~ SYSTEM::*FASOUTPUT-STREAM* <--> NIL") | (1 "EVAL frame for form (BREAK)") | (2 "EVAL frame for form (PROGN (BREAK) N)") | (3 "APPLY frame for call (FOO '1)") | (4 "EVAL frame for form (FOO 1)") | (5 "EVAL frame for form (SWANK:INTERACTIVE-EVAL "(foo 1)")") | (6 "EVAL frame for form (SWANK:START-SERVER "/tmp/seh/slime.800" :EXTERNAL-FORMAT :ISO-LATIN-1-UNIX)")) | (32)) | (:debug-activate 0 1) | (:emacs-rex | (swank:frame-locals-for-emacs 1) | nil 0 33) | (:return | (:ok | ((:name "N" :id 0 :value "1"))) | 33) `----