Debugging 在Emacs Lisp调试器中继续和退出之间的差异
当我在该表达式上按C-M-x时,Emacs在(/10)处失败时调用调试器。当我按c键继续而不是按q键退出时,调试器仍然不执行(print 22)或(/2 0)而退出。这里唯一的区别是c与消息一起退出Debugging 在Emacs Lisp调试器中继续和退出之间的差异,debugging,emacs,elisp,Debugging,Emacs,Elisp,当我在该表达式上按C-M-x时,Emacs在(/10)处失败时调用调试器。当我按c键继续而不是按q键退出时,调试器仍然不执行(print 22)或(/2 0)而退出。这里唯一的区别是c与消息一起退出 (progn (print 11) (/ 1 0) (print 22) (/ 2 0) (print 33)) 什么是c和q有很大区别的示例代码?我什么时候应该键入c而不是q?差异可以显示在任何不停止执行的代码中,即不包含错误(例如,当被调试调用时)。差异可以显示在任何不停止
(progn
(print 11)
(/ 1 0)
(print 22)
(/ 2 0)
(print 33))
什么是c和q有很大区别的示例代码?我什么时候应该键入c而不是q?差异可以显示在任何不停止执行的代码中,即不包含错误(例如,当被
调试
调用时)。差异可以显示在任何不停止执行的代码中,也就是说,不包含错误(例如,当被debug
调用时)。起初,我觉得这是一个非常明显的问题,
但是在尝试构建一个示例之后,我实际上不得不查看信息。
因此,让我总结一下我为自己澄清的内容:
edebug中的c与gdb中的c不同。
这一个只是在每个断点处停止一秒钟,最终退出。
我现在不知道它对任何人都有什么用处。
等价的是g:这个将持续到下一个断点
停在那里
下面是一个代码示例:
progn: Arithmetic error
要edebug
it:
将此代码粘贴到*scratch*
在foo
和C-u C-M-x中移动点(调用edebug defun
)
将点移动到setq y
中的y
,并将M-x edebug设置断点
将点移动到(foo)
和C-j中的结束栏
您现在进入了edebug
。在这里,您可以使用快捷方式b执行步骤3
而不是M-x
你会发现继续进行SPC是乏味的,因为它会
每次移动循环的每个语句
但是如果你按g键,你会跳过整个循环,结果是
在你应该感兴趣的声明中
起初,我觉得这是一个非常明显的问题,
但是在尝试构建一个示例之后,我实际上不得不查看信息。
因此,让我总结一下我为自己澄清的内容:
edebug中的c与gdb中的c不同。
这一个只是在每个断点处停止一秒钟,最终退出。
我现在不知道它对任何人都有什么用处。
等价的是g:这个将持续到下一个断点
停在那里
下面是一个代码示例:
progn: Arithmetic error
要edebug
it:
将此代码粘贴到*scratch*
在foo
和C-u C-M-x中移动点(调用edebug defun
)
将点移动到setq y
中的y
,并将M-x edebug设置断点
将点移动到(foo)
和C-j中的结束栏
您现在进入了edebug
。在这里,您可以使用快捷方式b执行步骤3
而不是M-x
你会发现继续进行SPC是乏味的,因为它会
每次移动循环的每个语句
但是如果你按g键,你会跳过整个循环,结果是
在你应该感兴趣的声明中
当您使用debug on signal
时,最容易看到差异。使用此设置,当发出错误信号时,调试器将被调用,即使该错误由封闭的条件案例处理。在这种情况下,c
将继续正常执行(即发出错误信号,这反过来会导致处理程序代码运行,然后处理程序代码可能会继续正常执行)。使用信号调试时,最容易看出差异。使用此设置,当发出错误信号时,调试器将被调用,即使该错误由封闭的条件案例处理。在这种情况下,c
将继续正常执行(即发出错误信号,这反过来会导致处理程序代码运行,然后可能继续正常执行)。另一个区别是递归编辑。例如,我可以调用queryreplace,然后输入recursive edit,然后键入(/10)
,并对其求值以进入调试器。现在,如果我按q,我们就回到了顶层,不再运行queryreplace。但如果我改按c,我仍然在递归编辑中
更新另一个区别。在调试器中,c
被绑定到debugger continue
,它是exit recursive edit
并且q
被绑定到顶级
。这意味着已知的退出递归编辑
与顶级
之间的任何差异都适用。看看有什么不同
下面是根据中的一个示例改编的示例,用于测试差异
(defun foo ()
(setq x (loop for i from 1 to 100
collecting (* i i)))
(setq y (nth 5 x))
(incf y))
(foo)
另一个区别是递归编辑。例如,我可以调用queryreplace,然后输入recursive edit,然后键入(/10)
,并对其求值以进入调试器。现在,如果我按q,我们就回到了顶层,不再运行queryreplace。但如果我改按c,我仍然在递归编辑中
更新另一个区别。在调试器中,c
被绑定到debugger continue
,它是exit recursive edit
并且q
被绑定到顶级
。这意味着已知的退出递归编辑
与顶级
之间的任何差异都适用。看看有什么不同
下面是根据中的一个示例改编的示例,用于测试差异
(defun foo ()
(setq x (loop for i from 1 to 100
collecting (* i i)))
(setq y (nth 5 x))
(incf y))
(foo)
Jisang Yoo:另请参见C-u M-x apropos变量RET debug on-RET
和C-u M-x apropos命令RET debug on-RET
n.b.以问题中的代码为基础的人工演示:(程序(打印11)(调试)(打印22)(调试)(打印33))
Jisang-yo:另见C-u M-x apropos变量RET-debug on-RET
和C-u M-x apropos comman