调试器缓冲区(处于调试器模式下)除了提供常规的 Emacs 命令 以及上一节介绍的调用栈模式命令外,还提供专用命令。 调试器命令最重要的用途是单步执行代码,以便观察控制流如何流转。 调试器可以单步执行**解释型函数**的控制结构,但无法对字节编译函数执行此操作。 如果你希望单步调试字节编译函数,请将其替换为同一函数的解释版定义。 (操作方法:打开该函数的源码,在其定义上按 C-M-x。) 你无法使用 Lisp 调试器单步执行原语函数。
部分调试器命令作用于**当前栈帧**。 如果某个栈帧以星号开头,表示退出该栈帧时会再次进入调试器。 这对查看函数的返回值非常有用。
以下是调试器模式的命令列表:
退出调试器并继续执行。 这将恢复程序执行,仿佛从未进入过调试器(不包括你在调试器内部修改变量值或数据结构带来的副作用)。
继续执行,但在下一次调用任意 Lisp 函数时进入调试器。 这使你可以单步执行表达式的子表达式,查看子表达式计算出的值以及它们的其他行为。
以这种方式触发调试器的函数调用所创建的栈帧会被自动标记, 以便退出该栈帧时再次调用调试器。 你可以使用 u 命令取消此标记。
标记当前栈帧,使退出该栈帧时进入调试器。 以这种方式标记的栈帧在调用栈缓冲区中会显示星号。
退出当前栈帧时不进入调试器。 这会取消对该栈帧执行的 b 命令。 直观效果是调用栈缓冲区中对应行的星号消失。
像 b 一样标记当前栈帧,
然后像 c 一样继续执行,但临时禁用所有通过 debug-on-entry
设置了入口断点的函数的断点。
在迷你缓冲区读取一个 Lisp 表达式,
在相关词法环境中(如适用)对其求值,并在回显区打印结果。
调试器在运行时会修改某些重要变量与当前缓冲区;
e 会临时恢复它们在调试器外部的值,以便你检查和修改。
这让调试器更加透明。
相比之下,M-: 在调试器中无特殊处理,直接显示调试器内部的变量值。
默认情况下,该命令在求值期间会抑制调试器,避免被求值表达式中的错误在原有错误之上叠加新错误。
将用户选项 debug-allow-recursive-debug 设为非nil 可覆盖此行为。
与 e 类似,但同时将求值结果保存到 *Debugger-record* 缓冲区。
终止正在调试的程序,返回到顶层 Emacs 命令执行。
如果调试器是因 C-g 进入,但你只想退出而非调试,请使用 q 命令。
从调试器返回一个值。 该值通过在迷你缓冲区读取表达式并求值得到。
当调试器因退出 Lisp 调用栈帧(通过 b 请求或用 d 进入该帧)而被调用时,
r 命令非常有用;此时 r 命令指定的值会作为该栈帧的返回值。
如果你调用了 debug 并使用其返回值,该命令也很有用。
其他情况下,r 与 c 效果相同,指定的返回值无效。
调试器因错误进入时,无法使用 r。
显示设置了调用时触发调试器的函数列表。
即通过 debug-on-entry 设置了入口断点的函数。