19.1.10 调用调试器

本节详细介绍用于调用调试器的 debug 函数。

Command: debug &rest debugger-args

该函数进入调试器。 在交互式会话中,它会切换到名为 *Backtrace* 的缓冲区 (如果是递归进入调试器的第二次调用,则为 *Backtrace*<2>,依此类推), 并填充 Lisp 函数调用栈的相关信息。 随后进入递归编辑状态,以调试器模式显示调用栈缓冲区。 在批处理模式下(更一般地,当 noninteractive 为非nil 时,see Batch Mode), 该函数会在标准错误流中显示 Lisp 调用栈, 然后终止 Emacs 并使其以非零退出码退出(see Killing Emacs)。 将 backtrace-on-error-noninteractive 绑定为 nil 可抑制批处理模式下的调用栈输出,详见下文。

调试器模式的 cdjr 命令会退出递归编辑; 之后 debug 切换回之前的缓冲区,并返回到调用 debug 的位置。 这是 debug 函数唯一能返回给调用者的方式。

debugger-args 参数的作用是:debug 会将剩余参数显示在 *Backtrace* 缓冲区顶部,供用户查看。 除下文所述情况外,这是这些参数的**唯一**用途。

debug 的第一个参数若为特定值,则具有特殊含义。 (通常这些值仅由 Emacs 内部使用,而非程序员调用 debug 时使用。) 以下是这些特殊值的说明:

lambda

第一个参数为 lambda 表示: 因 debug-on-next-call 为非nil,在进入某个函数时调用了 debug。 调试器会在缓冲区顶部显示一行文本:‘调试器进入--进入函数:(Debugger entered--entering a function:)’。

debug

第一个参数为 debug 表示: 因进入了设置了入口断点的函数,调用了 debug。 调试器会像 lambda 情况一样显示字符串 ‘调试器进入--进入函数:(Debugger entered--entering a function:)’, 同时标记该函数的栈帧,使其在退出时触发调试器。

t

第一个参数为 t 表示: 因 debug-on-next-call 为非nil,在求值某个函数调用表达式时调用了 debug。 调试器会在缓冲区顶部显示:‘调试器进入--开始求值函数调用表达式:(Debugger entered--beginning evaluation of function call form:)’。

exit

第一个参数为 exit 表示: 退出之前标记为“退出时触发调试器”的栈帧时调用了 debug。 此时 debug 的第二个参数是该栈帧要返回的值。 调试器会在缓冲区顶部显示 ‘调试器进入--返回值:(Debugger entered--returning value:)’,后跟要返回的值。

error

第一个参数为 error 表示: 因错误或 quit 信号被触发且未被处理,进入调试器。 调试器会显示 ‘调试器进入--Lisp 错误:(Debugger entered--Lisp error:)’, 后跟触发的错误及 signal 的所有参数。例如:

(let ((debug-on-error t))
  (/ 1 0))

------ Buffer: *Backtrace* ------
Debugger entered--Lisp error: (arith-error)
  /(1 0)
...
------ Buffer: *Backtrace* ------

若触发的是错误信号,通常 debug-on-error 为非nil; 若触发的是 quit 信号,通常 debug-on-quit 为非nil

nil

当你希望显式进入调试器时,可将 debugger-args 的第一个参数设为 nil。 剩余的 debugger-args 会打印在缓冲区首行。 你可利用此特性显示自定义消息——例如,提醒自己调用 debug 的触发条件。

Variable: backtrace-on-error-noninteractive

该变量默认值为非nil,表示批处理模式下进入调试器时会显示 Lisp 函数调用栈。 将该变量绑定为 nil 会抑制调用栈输出,仅显示错误消息。


emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© 2025 Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike