由于技术原因,当重绘过程调用的 Lisp 代码发生错误时, Emacs 常规的调试机制无法使用。 本节介绍如何从这类错误中获取调用栈,这对调试此类错误有帮助。
这些方法适用于以下场景中使用的 Lisp 形式:
例如 :eval 模式行结构(see The Data Structure of the Mode Line),
以及所有从重绘过程调用的钩子,包括:
fontification-functions (see Automatic Face Assignment).
window-scroll-functions (see Hooks for Window Scrolling and Changes).
注意:如果重绘调用的钩子函数中发生错误,
错误处理机制可能会将该函数从钩子中移除。
因此你需要以某种方式重新初始化该钩子(例如使用 add-hook),
才能重现该问题。
要在此类场景下生成调用栈,需将变量 backtrace-on-redisplay-error
设为非nil。错误发生时,Emacs 会将调用栈输出到
*Redisplay-trace* 缓冲区,但不会自动在窗口中显示该缓冲区。
这样做是为了避免不必要地破坏你正在调试的重绘过程。
你需要手动显示该缓冲区,例如使用命令
switch-to-buffer-other-frame(C-x 5 b)。
将该变量设为非nil,可在重绘调用的任意 Lisp 代码发生错误时
生成调用栈。