要使用 Edebug 调试 Lisp 程序,必须先对需要调试的 Lisp 代码进行 插桩(instrument)。
一种简单的方法是:将光标移到函数或宏的定义内部,然后按 C-u C-M-x(带前缀参数的 eval-defun)。
其他插桩方式见 Edebug 的代码插桩。
函数被插桩后,任何对该函数的调用都会激活 Edebug。 根据你选择的 Edebug 运行模式,激活 Edebug 可能会暂停执行并允许单步调试, 也可能只刷新显示并继续执行,同时监听调试命令。 默认运行模式为单步模式(step),会暂停执行。See Edebug 运行模式。
在 Edebug 中,你通常会看到一个显示正在调试的 Lisp 源码的 Emacs 缓冲区, 称为 源码缓冲区(source code buffer),它暂时为只读状态。
左侧边缘的箭头指示函数当前正在执行的行。 光标初始时指向该行内函数正在执行的具体位置,但如果你手动移动光标,这一对应关系就不再成立。
如果你对下面的 fac 函数定义进行插桩,然后执行 (fac 3),
通常会看到如下显示。光标位于 if 前面的左括号处:
(defun fac (n)
=>∗(if (< 0 n)
(* n (fac (1- n)))
1))
函数内部 Edebug 可以暂停执行的位置称为 暂停点(stop points)。
每个列表子表达式的前后,以及每个变量引用之后,都会设置暂停点。
下面用点号标出 fac 函数中的暂停点:
(defun fac (n)
.(if .(< 0 n.).
.(* n. .(fac .(1- n.).).).
1).)
源码缓冲区中除了 Emacs Lisp 模式的命令外,还可以使用 Edebug 的专用命令。
例如,输入 Edebug 命令 SPC 可以执行到下一个暂停点。
进入 fac 后按一次 SPC,显示如下:
(defun fac (n)
=>(if ∗(< 0 n)
(* n (fac (1- n)))
1))
当 Edebug 在某个表达式执行后暂停时,会在回显区显示该表达式的值。
其他常用命令:b 在暂停点设置断点,g 执行到断点处, q 退出 Edebug 并返回顶层命令循环。 输入 ? 可显示所有 Edebug 命令列表。