19.2.1 使用 Edebug

要使用 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 命令列表。


emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© 2025 Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike