19.1.9 调试器命令

调试器缓冲区(处于调试器模式下)除了提供常规的 Emacs 命令 以及上一节介绍的调用栈模式命令外,还提供专用命令。 调试器命令最重要的用途是单步执行代码,以便观察控制流如何流转。 调试器可以单步执行**解释型函数**的控制结构,但无法对字节编译函数执行此操作。 如果你希望单步调试字节编译函数,请将其替换为同一函数的解释版定义。 (操作方法:打开该函数的源码,在其定义上按 C-M-x。) 你无法使用 Lisp 调试器单步执行原语函数。

部分调试器命令作用于**当前栈帧**。 如果某个栈帧以星号开头,表示退出该栈帧时会再次进入调试器。 这对查看函数的返回值非常有用。

以下是调试器模式的命令列表:

c

退出调试器并继续执行。 这将恢复程序执行,仿佛从未进入过调试器(不包括你在调试器内部修改变量值或数据结构带来的副作用)。

d

继续执行,但在下一次调用任意 Lisp 函数时进入调试器。 这使你可以单步执行表达式的子表达式,查看子表达式计算出的值以及它们的其他行为。

以这种方式触发调试器的函数调用所创建的栈帧会被自动标记, 以便退出该栈帧时再次调用调试器。 你可以使用 u 命令取消此标记。

b

标记当前栈帧,使退出该栈帧时进入调试器。 以这种方式标记的栈帧在调用栈缓冲区中会显示星号。

u

退出当前栈帧时不进入调试器。 这会取消对该栈帧执行的 b 命令。 直观效果是调用栈缓冲区中对应行的星号消失。

j

b 一样标记当前栈帧, 然后像 c 一样继续执行,但临时禁用所有通过 debug-on-entry 设置了入口断点的函数的断点。

e

在迷你缓冲区读取一个 Lisp 表达式, 在相关词法环境中(如适用)对其求值,并在回显区打印结果。 调试器在运行时会修改某些重要变量与当前缓冲区; e 会临时恢复它们在调试器外部的值,以便你检查和修改。 这让调试器更加透明。 相比之下,M-: 在调试器中无特殊处理,直接显示调试器内部的变量值。 默认情况下,该命令在求值期间会抑制调试器,避免被求值表达式中的错误在原有错误之上叠加新错误。 将用户选项 debug-allow-recursive-debug 设为非nil 可覆盖此行为。

R

e 类似,但同时将求值结果保存到 *Debugger-record* 缓冲区。

q

终止正在调试的程序,返回到顶层 Emacs 命令执行。

如果调试器是因 C-g 进入,但你只想退出而非调试,请使用 q 命令。

r

从调试器返回一个值。 该值通过在迷你缓冲区读取表达式并求值得到。

当调试器因退出 Lisp 调用栈帧(通过 b 请求或用 d 进入该帧)而被调用时, r 命令非常有用;此时 r 命令指定的值会作为该栈帧的返回值。 如果你调用了 debug 并使用其返回值,该命令也很有用。 其他情况下,rc 效果相同,指定的返回值无效。

调试器因错误进入时,无法使用 r

l

显示设置了调用时触发调试器的函数列表。 即通过 debug-on-entry 设置了入口断点的函数。


emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© 2025 Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike