调试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最常用的几个快捷键:

详细的请见Slime中文文档:http://slime-user-manual-cn.readthedocs.org/en/latest/chapter-4.html