本节详细介绍用于调用调试器的 debug 函数。
该函数进入调试器。
在交互式会话中,它会切换到名为 *Backtrace* 的缓冲区
(如果是递归进入调试器的第二次调用,则为 *Backtrace*<2>,依此类推),
并填充 Lisp 函数调用栈的相关信息。
随后进入递归编辑状态,以调试器模式显示调用栈缓冲区。
在批处理模式下(更一般地,当 noninteractive 为非nil 时,see Batch Mode),
该函数会在标准错误流中显示 Lisp 调用栈,
然后终止 Emacs 并使其以非零退出码退出(see Killing Emacs)。
将 backtrace-on-error-noninteractive 绑定为 nil 可抑制批处理模式下的调用栈输出,详见下文。
调试器模式的 c、d、j 和 r 命令会退出递归编辑;
之后 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 的触发条件。
该变量默认值为非nil,表示批处理模式下进入调试器时会显示 Lisp 函数调用栈。
将该变量绑定为 nil 会抑制调用栈输出,仅显示错误消息。