SLIME:SLDB - lisp-cookbook-ja/common-lisp GitHub Wiki
処理系によって、サポートされている機能や、バックトレースのフォーマットなどに違いがあります。
> (error "error")
SLIMEでは、処理系がデバッガを起動する場面で、自動的にSLDBが起動します。
error
[Condition of type SIMPLE-ERROR]
Restarts:
0: [RETRY] Retry SLIME REPL evaluation request.
1: [*ABORT] Return to SLIME's top level.
2: [ABORT-BREAK] Reset this thread
3: [ABORT] Kill this thread
Backtrace:
0: (CCL::CALL-CHECK-REGS ERROR "error")
1: (CCL::CHEAP-EVAL (ERROR "error"))
--more--
ブレークポイント
ANSIで定義されているbreakを、停止したい位置で呼び出します。
> (defun fact (n)
(break)
(if (zerop n)
1
(* n (fact (1- n)))))
FACT
> (fact 5)
というコードを実行すると、
[Condition of type SIMPLE-CONDITION]
Restarts:
0: [CONTINUE] Return from BREAK.
1: [RETRY] Retry SLIME REPL evaluation request.
2: [*ABORT] Return to SLIME's top level.
3: [ABORT-BREAK] Reset this thread
4: [ABORT] Kill this thread
Backtrace:
0: (FACT 5)
1: (CCL::CALL-CHECK-REGS FACT 5)
2: (CCL::CHEAP-EVAL (FACT 5))
--more--
といった感じで、SLDBが起動します。
リスタート
SLDBを抜けるには、表示されているリスタートの一覧の中から、どれかひとつを選んで実行しなければなりません。上のブレークポイントの例では、
Restarts:
0: [CONTINUE] Return from BREAK.
1: [RETRY] Retry SLIME REPL evaluation request.
2: [*ABORT] Return to SLIME's top level.
3: [ABORT-BREAK] Reset this thread
4: [ABORT] Kill this thread
がリスタートの一覧です。番号が振ってある行の上にカーソルを移動させ、RETキーで実行できます。また、ショートカットのために、以下のキーバインドが定義されています。
:a:ABORTする。 :q:トップレベルへ抜ける。 :c:CONTINUEする。 :0~9:対応する番号のリスタートを実行する。
スタックフレーム
バックトレースに表示されているスタックフレームに対して、操作や、環境の中での評価ができます。
Backtrace:
0: (FACT 5)
1: (CCL::CALL-CHECK-REGS FACT 5)
2: (CCL::CHEAP-EVAL (FACT 5))
--more--
番号が振ってある行が各フレームです。対象にしたいフレームの上にカーソルを移動させてから、以下のコマンドを実行します。
:t:ローカル変数を表示するかしないかを切り替えます。 :v:フレームに対応するコードを表示します。 :e:フレームの環境の中で式を評価します。結果はミニバッファに表示されます。 :d:フレームの環境の中で式を評価します。結果は新しいバッファに表示されます。 :D:フレームに対応する関数を逆アセンブルします。 :i: フレームの環境の中で式を評価して、結果をSLIME:インスペクタで表示します。 :C-c C-c:フレームに対応するコードを再コンパイルします。
また、対象のフレームを楽に切り替えられるように、以下のキーバインドが定義されています。
:n:ひとつ下のフレームに移動します。 :p:ひとつ上のフレームに移動します。 :M-n:現在のフレームの詳細を隠してから、ひとつ下のフレームに移動し、詳細とコードを表示します。 :M-p:現在のフレームの詳細を隠してから、ひとつ上のフレームに移動し、詳細とコードを表示します。 :>:一番下のフレームに移動します。 :<:一番上のフレームに移動します。
ステップ実行
一部の処理系ではステップ実行ができます。
:s:ステップインします。 :x:ステップオーバーします。 :o:ステップアウトします。
その他の機能
:r:同じ引数でフレームの実行を再開します。 :R:ミニバッファから入力する値でフレームから戻ります。 :B:SLDBを終了し、処理系のデバッガを起動します。 :C: デバッグ中のコンディションをSLIME:インスペクタで表示します。 :::ミニバッファから入力する式をトップレベルで評価します。