SLIME:SLDB - lisp-cookbook-ja/common-lisp GitHub Wiki

開発環境 SLIME

処理系によって、サポートされている機能や、バックトレースのフォーマットなどに違いがあります。

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

$$toc


ブレークポイント

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:インスペクタで表示します。 :::ミニバッファから入力する式をトップレベルで評価します。


参考文献