四、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里输入一个表达式并求值。
原文: https://slime-user-manual-cn.readthedocs.io/en/latest/chapter-4.html