调试 Common Lisp代码
Common Lisp 标准是允许自定义调试代码的,在 Slime 中触发异常后会自动调用它自己的调试器SLDB。
现代的 Common Lisp 实现都对函数编译时做了高质量的优化,比如 SBCL 默认情况下会对函数进行编译,编译后的代码会影响调试。因此,我们在调试代码的时候不能使用优化编译过的函数。有两种方法:
一个是全局执行,这样每个函数都不会被优化:
(proclaim '(optimize (debug 3)))
二是在函数内使用 declare:
(defun test () (declare (optimize (debug 3))) ...)
这时我们再对函数进行编译,就可以在 REPL 中调试了。注意,如果要调试的函数在执行上面代码之前就编译了的话,需要重新编译一次。
Common Lisp 提供了 break 函数可以便于我们下断点,如:
(defun test1 () (declare (optimize (debug 3))) (break) ;; 下断点 (loop for i from 0 to 10 do (print i)))
当代码执行到断点代码时,会触发 SLDB。
SLDB 最常用的几个快捷键:
- s 单步运行下一个表达式
- c Continue
- v 在源码中显示出当前执行的表达式
- q 终止调试
详细的请见 Slime 中文文档:http://slime-user-manual-cn.readthedocs.org/en/latest/chapter-4.html