Emacs Lisp调试器中continue和quit之间的区别

时间:2013-09-09 08:38:20

标签: debugging emacs elisp

(progn
  (print 11)
  (/ 1 0)
  (print 22)
  (/ 2 0)
  (print 33))

当我在该表达式上按C-M-x时,Emacs在(/ 1 0)失败时调用调试器。当我按c继续而不是q退出时,调试器仍然退出而不执行(print 22)或(/ 2 0)。这里唯一的区别是c退出并带有消息

progn: Arithmetic error

什么是示例代码,其中c和q有很大的不同,何时应该键入c而不是q?

4 个答案:

答案 0 :(得分:2)

可以在任何不会停止执行的代码中显示差异,即不包含错误(例如,在debug调用时)。

答案 1 :(得分:2)

使用debug-on-signal时,最容易看出差异。使用此设置,在发出错误信号时调用调试器,即使该错误由封闭的condition-case处理。在这种情况下c将继续正常执行(即发出错误信号,这反过来导致处理程序代码运行,然后可以继续正常执行)。

答案 2 :(得分:0)

起初我觉得这个问题非常明显, 但在尝试建立一个例子之后,我实际上不得不查看info。 因此,让我总结一下我为自己澄清的内容:

edebug中的

c gdb中的 c 不同。 这个在每个断点处停止一秒钟并最终退出。 我现在还没有看到它对任何人都有用。 等价的是 g :这个将持续到下一个断点 并停在那里。

这是一个代码示例:

(defun foo ()
  (setq x (loop for i from 1 to 100
             collecting (* i i)))
  (setq y (nth 5 x))
  (incf y))

(foo)

edebug

  1. 将此代码粘贴到*scratch*
  2. foo C-u C-M-x 内移动点(调用edebug-defun
  3. 将点移至y中的setq y M-x edebug-set-breakpoint
  4. 将点移至(foo) C-j
  5. 中的结束点
  6. 你现在在edebug。在这里,您可以使用快捷键 b 执行第3步 而不是 M-x ...
  7. 你会发现继续使用 SPC 很乏味,因为它会 每次移动循环的每个语句。
  8. 但如果你按 g ,你将跳过整个循环,结束 在你应该感兴趣的声明中。

答案 3 :(得分:0)

另一个区别在于递归编辑。例如,我可以调用query-replace,然后输入递归编辑,然后键入(/ 1 0)并对其进行评估以进入调试器。现在,如果我按q,我们将返回顶级并且不再运行查询替换。但是如果我按c而不是,我仍然在递归编辑中。

更新另一个区别。在调试器中,c绑定到debugger-continueexit-recursive-editq的包装器 和top-level绑定到exit-recursive-edit。这意味着已知有top-level(defun simple-rec () (forward-word 1) (message "111") (debug) (message "222") (forward-word 1)) 相关的任何差异。有关差异,请参阅Recursive Edit - Emacs Manual

以下是根据Recursive Editing - Emacs Lisp Manual中的示例改编的示例来测试差异。

{{1}}