「Emacs Lisp」- 调试(学习编辑)

  CREATE BY JENKINSBOT

问题描述

在我们刚入行的时候,唯一的调试方式就是打印输出调试,echo printf message,各种打印,从来没使用过调试器,一直觉得调试器很难搞。现在想想,多半是因为当时的我们不愿意接受新事物吧,或者不想学习新东西。

后来代码越来越复杂,打印调试变得不再可行,调试器成为最佳方法。再后来,我们也越来越喜欢使用调试器。当然,有时候只是为了查看某个值,也没有必要使用调试器。

该笔记将记录:在 Emcas Lisp 中,如果使用 GNU Emacs 进行调试的各种方法,以及常见问题处理。

解决方案

debug-on-entry

适用范围:
1)该方法比较初级,适用于简单调试单个函数;
2)如果函数调用栈较深,不适合使用该方法;

进入调试:
1)使用 M-x debug-on-entry [RET] <function name> [RET] 启用;
2)在代码中,当调用 <function name> 函数时,进入该函数的调试模式;
2)调试信息(栈信息),将显示在 *Backtrace* 缓冲区,可以观察调用栈;

调试方法:
1)当进入调试模式后,在 *Backtrace* 中,按下 d 键进行逐步调试,每次执行一个表达式求值。
2)在 *Backtrace* 中,按下 q 键退出函数调试。

关闭调试:
1)如果要关闭函数调试,通过 M-x cancel-debug-on-entry [RET] <function name> [RET] 关闭。

debug-on-error

适用范围:
1)在出现错误时,进入错误函数的调试模式;
2)该方法不能选择函数;

进入调试:
1)M-x set-variable [RET] debug-on-error [RET] t
2)在下次遇到错误时,进入调试模式,调试信将显示在 *Backtrace* 缓冲区。

调试方法:
1)与 debug-on-entry 想法

关闭调试:
1)M-x set-variable [RET] debug-on-error [RET] nil

补充说明:
使用 M-x toggle-debug-on-error 功能,进行 debug-on-error 切换,而无需设置该变量。

debug-on-quit

适用范围:
1)该方式的特征是:在按下 C-g 时进入调试模式,用于调试死循环;

进入调试:
1)M-x toggle-debug-on-quit,或者 M-x set-variable [RET] debug-on-quit [RET] t
2)在启用后,任何时刻按下 C-g 都可以进入调试。

关闭调试:
1)M-x toggle-debug-on-quit,或者 M-x set-variable [RET] debug-on-quit [RET] nil) 关闭

(debug)

通过在程序中插入 (debug) 进行调试。我们没有使用该方法,这里仅进行记录,用于日后使用。

M-x edebug(源码级调试器)

启用调试:
1)对函数执行 C-u C-M-x 来绑定函数。当调用函数时,将进入函数的调试模式。

调试方法:
1)使用 SPC 进行单步调试,箭头显示当前正在执行的函数;
2)在执行结束后,按下 c 结束当前调试,以准备进入下一次调试;

关闭调试:
1)M-x edebug-remove-instrumentation [RET] <function-name> [RET],移除特定函数的绑定;
2)M-x edebug-remove-instrumentation [RET] [RET],移除全部绑定函数;

学习资料:
1)在官方文档中的演示:17.4 The edebug Source Level Debugger
2)18.2 Edebug

TODO Emacs edebug 如何显示 Buffer 的内容。

参考文献

17.2 debug-on-entry
debugging – How to use edebug on a function – Emacs Stack Exchange