edebug了几个函数, 然后关闭了函数所在文件, 然后emacs就没法退出了, 坑!

debug那几个函数跟文件打开有关, 所以, 现在是:

  1. 无法打开文件, 一打开edebug就报错, 原因应该是debug的那几个函数执行到了, edebug找不到. 所以没法打开刚才调试的那个文件
  2. 无法退出emacs, 原因是kill-emacs-hook里有函数打开文件保存数据的操作

尴尬了. 除了把kill-emacs-hook设置为nil, 有没有其他办法? 比如怎样让edebug完全退出?不要再debug了?

M-x edebug-all-defs

文档看不太懂, 下次试试. 你用过吗? 具体是什么功能?

Toggle edebugging of all definitions.

也就是全局打开/关闭edebug

试了一下, 不行, 它对应一个变量, 好像是影响edebug-defun这些函数调用的时候的行为, 这些函数调用过之后好像就影响不了了.

edebug-all-defs 不是用来取消所有会被 Edebug 的函数,它的 Docstring 有些误导:

edebug-all-defs is an interactive autoloaded compiled Lisp function in `edebug.el’.

(edebug-all-defs)

Toggle edebugging of all definitions.

这个命令开关选项(变量) edebug-all-defs,其用来控制 C-M-x 如何处理 C-u:默认情况下 C-u C-M-x 是标记 Edebug,不带 C-M-x 是取消标记,打开这个选项会翻转这个行为,即 C-M-x 是 Edebug,而 C-u C-M-x 是取消。

3 个赞

把相应函数取消 debug,用命令 C-M-x (M-x eval-defun) 或 M-x eval-buffer 或函数 load

  • C-M-x 一个函数
  • eval-buffer 一个Buffer 中的所有函数
  • load 一个文件中的所有函数

目前不知道有没有办法一次性取消不同文件中的所有函数的 debug。

这个功能感觉会挺有用。可以报个bug

已提交 https://debbugs.gnu.org/cgi/bugreport.cgi?bug=37899

I edebug(use edebug-defun) some functions in file.el and then close file.el. When I open a new file, emacs aborts and show a buffer with edebug error(It can’t find the original source buffer to debug).

Work-Around:重新打开 file.el,然后 eval-buffer 就 OK 了吧?

打不开,里面已经说了,没法打开文件,因为edebug调试了几个打开文件相关的函数,一打开文件edebug就报错

我还遇到过更坑的,就是edebug的执行结果和真正的执行结果不一样。所以我现在如果要debug,就乖乖用老的debugger。

直接(let (kill-emacs-hook) (kill-emacs))


问:

执行了(fset 'kill-emacs nil)之后不能从emacs退出了!怎么办,在线等,急!

答:

不用top杀掉留着过年吗?

1 个赞

不是很好,很多会话相关的东西都不能保存了

这种bug应该上报了

打不开的话可以试试 load,它用 C 实现的,也不可能被 Debug。

(load (locate-library "files"))

这些笨办法倒是能想到, 但是太麻烦了, 印象中好多次遇到这样的问题了, 有时候调试了好几个文件, 还要一个一个来load, 有时候是调试非load-path里的文件(比如我有个my-scratch.el文件), 有时候是在scratch写了临时测试函数并调试, 然后清空或者关闭了该buffer, 同时忘记了, 然后开始正常工作, 无意中一个操作触发了那个函数的edebug, 突然蹦出来错误. 手工处理很麻烦.

在邮件列表上问了一下, 其中一个开发者是一个一个 M-x load-library, 另外, 有人回复说emacs 27好像增加了一个这样的命令, 我测试一下.

emacs 27的NEWS:

*** New command 'edebug-remove-instrumentation.
This command removes Edebug instrumentation from all functions that
have been instrumented.

该命令可以在emacs26里面使用, 没有其他依赖, 亲测有效.

4 个赞