2015-01-11 10 views
5

ブレークのようなものでデバッガを起動した後、sbclとSlimeでコードをステップ実行する方法を理解しようとしています。私は最初から踏み出す必要はありません。たとえば、次のコードがあるとします。デバッガ内からsbclを実行する

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

ブレークポイントがヒットした後、コードをステップ実行することができます。私がこれを行うために見つけた唯一の方法は、スライムの枠を越えて、 "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}>) 

私は何を探しています可能なはずである。

私は「ステップ」(S)機能を使用しよう

、代わりに実際にステッピングのは、私は、これが与えられています。

ステッピングSBCLマニュアルからデバッガ内からマクロstep、又はを介して呼び出すことができます。

私はスライム2.12でSBCL 1.2.5を実行していますし、私の最適化の資質は、私はこのため3にデバッグをセットしてスワンクをコンパイルしていた両方の3

+1

これは実際にはコンテキスト外です。バグやサポート要求のようです。あなたはIRC#lispチャンネルでfreenodeやSLIMEのメーリングリストで質問しようとしましたか?それはあなたがSLIMEなしでそれを踏み出そうとしたようではないので、SBCLについては直接見えません。 – acelent

答えて

1

あり、安全性とデバッグを除くすべての1です私が休憩後に歩いていくと、スワンクに足を踏み入れて奇妙な行動を説明しました。

1

私は共通のlispを学び始めて以来、ステップのデバッグ作業をしようとするのに苦労しています。

は、端末の新SBCLセッションが開始されました:この美しいチュートリアルdebugging with slimeを読んだ後、私は... これは(自分を試す前に、最後まで読んで)私はスワンクを再コンパイルする何をしたかであるステップデバッガにもう一度チャンスを与えることを考えました:仕事、私は別のアプローチのために行ってきましたしませんでした、私はswank.lispにこれを追加

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 

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

リスタートスライム、それはいくつかのファイルを再コンパイルし、期待通りTHENそれが働きました。

(上記を実行する前に、私はまたし、スワンク/ 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がヒットしたら、コードを介して のステップを踏み出すことができるようにしたい。私はこれを行うに発見した唯一の方法は、スライムに の上にフレームを行く「フレームからのリターン」(R)機能を使用すると、(ステップ(FIB 2))で を入力することです。」

実際には、s!フレームから戻る必要はなく、休憩が行われた後にsを押すだけです。これが機能するには、初期化ファイル(例:.sbclrc)に(declaim (optimize (debug 3)))がなければならないことに注意してください。

関連する問題