四、SLDB:Slime调试器 ================== slime有一个自己的基于Emacs的调试器,SLDB。Lisp系统里的状况(Condition)发出的信号会在Emacs里通过Lisp符号*DEBUGGER-HOOK*触发SLDB。 当有状况发出信号时,SLDB会生成一个新的缓冲区。这个缓冲区会显示对状况的描述、一系列重启选项和调用栈。可以通过提供的命令来出发重启、检查调用栈和在堆栈调用窗口里移动。 4.1 检查窗口 ---------- 用来查看光标处的堆栈调用窗口的命令。 * t 或 M-x sldb-toggle-details 出发显示本地变量和CATCH标签 * v 或M-x sldb-show-source 查看窗口处的当前代码表达式。此表达式会被展现在Lisp源代码的缓冲区里。 * e 或 M-x sldb-eval-in-frame 对窗口里的表达式求值。表达式可以引用窗口里可用的局部变量。 * d 或 M-x sldb-pprint-eval-in-frame 对窗口里的表达式求值,并且在一个临时缓冲区里打印出来。 * D 或 M-x sldb-disassemble 拆解窗口处的函数。包括例如窗口对指令指针等信息。 * i 或 M-x sldb-inspect-in-frame 查看对窗口里一个函数求值后的结果。 * C-c C-c 或 M-x sldb-recompile-frame-source 重新编译窗口。C-u C-c C-c 是以最大调试模式重新编译。 4.2 重启 ---------- * a 或 M-x sldb-abort 触发ABORT重启。 * q 或 M-x sldb-quit “QUIT”——THROW一个top-level的Slime请求循环可以捕获的标签。 * c 或 M-x sldb-continue 触发CONTINUE重启。 * 0 ... 9 通过数字触发重启。 重启也可以通过在缓冲区里按RET或者Mouse-2来触发。 4.3 在不同的窗口间操作 ---------- * n 或 M-x sldb-down, p 或 M-x sldb-up 在不同窗口间移动。 * M-n 或 M-x sldb-details-down, M-p 或 M-x sldb-details-up 有技巧地在不同窗口间移动:隐藏之前窗口的详细信息,显示下一个窗口的详细信息和源代码。这些小技巧让你只看到当前窗口的详细信息和源代码。 * > 或 M-x sldb-end-of-backtrace 获取所有的堆栈调用并且到最后一个窗口。 * < 或 M-x sldb-beginning-of-backtrace 到第一个窗口。 4.4 单步调试 ---------- 单步调试并非在所有的Lisp实现里都是可用的,在那些可用的Lisp实现中,它的表现也很不同。 * s 或 M-x sldb-step 单步运行窗口中的下一个表达式。对CMUCL来说,即时在从当前位置可到达的所有代码的位置上设置断点。 * x 或 M-x sldb-next 单步运行函数里的下一个形式。 * o 或 M-x sldb-out 暂时停止单步调试,当前函数一返回则恢复单步调试。 4.5 其它命令 ---------- * r 或 M-x sldb-restart-frame 以当前窗口最先运行时的参数为参数重启。(此命令并非在所有Lisp实现里都可用) * R 或 M-x sldb-return-from-frame 在minibuffer里输入一个值,并以这个值为返回值回到窗口。(此命令并非在所有Lisp实现里都可用) * B 或 M-x sldb-break-with-default-debugger 退出SLDB并且以Lisp默认的调试器调试状况。 * C 或 M-x sldb-inspect-condition 查看当前正在调试的状况。 * : 或 M-x slime-interactive-eval 在minibuffer里输入一个表达式并求值。