我在 C# flymake 模块中的 emacs elisp 中获得了 CPU 旋转。(Flymake 是 emacs 中定期运行构建的模块,然后突出显示当前缓冲区中的任何语法错误或警告。)
我将涉足代码,寻找可能发生旋转的地方。
当我在做的时候,有人对弄清楚旋转有什么建议吗?emacs 中有什么东西可以让我停止执行并查看它停止的位置吗?
用于M-x set-variable
设置debug-on-quit
为t
。然后当问题发生时,点击C-g,调试器会给你一个你停止它时正在运行的回溯。
Flymake 为每个启用了 flymake-mode 的缓冲区设置一个 1 秒的计时器,以检查缓冲区是否在flymake-no-changes-timeout
几秒前被修改。
如果你在 flymake 模式下打开了很多缓冲区(几百个),那么这会消耗大量的 CPU,我有一个补丁版本的 flymake,它有一个修复这个问题的全局计时器,以及其他一些问题:https ://github.com/illusori/emacs-flymake
这对你来说可能不是同一个问题,但对我来说,在桌面模式下打开 600 个文件时它会锁定 Emacs,我很幸运每 15 分钟处理一次按键。
在 OS XI 上有一个类似的声音问题,当打开一个新文件时 flymake 会挂起 emacs(即使只打开了几个缓冲区)。启用debug-on-quit
没有帮助,因为整个 GUI 都被锁定了。
将 gdb 附加到 emacs 会返回以下内容:
$ gdb -p `psgrep emacs`
(gdb) bt
#0 0x00007fff98954e42 in __semwait_signal ()
#1 0x00007fff8e5d1dea in nanosleep ()
#2 0x00007fff99e3af05 in +[NSThread sleepUntilDate:] ()
#3 0x000000010015d917 in -[EmacsDialogPanel runDialogAt:] ()
#4 0x000000010015fa1f in ns_popup_dialog ()
[...]
所以锁定是由一个对话框消息引起的,说“运行时发生配置错误......”或类似的
从描述问题的这篇文章中,您可以使用以下内容禁用这些弹出消息:
然而,有时,Emacs 只是挂起。OS X 红色/黄色/蓝色关闭/最小化/缩放按钮变成灰色,好像 Emacs 失去了焦点,但它实际上是活动的应用程序。将任务切换回 Emacs 并不能恢复它。你不能 Command-Q 退出它。
当你最终放弃并杀死它并重新启动时,你已经失去了你的工作,你的外壳,并且它不会保存最近文件的列表。
(setq flymake-gui-warnings-enabled nil)
这可以防止 flymake 提醒您它正在自行关闭,但它比替代方案更好。
flymake-display-warning 调用 Emac 的“消息框”功能,因此可能有其他工具会导致相同的问题。
还有一个通用变量 use-dialog-box 但将其从默认 t 设置为 nil 对 flymake 没有帮助。互联网上还有一个建议使用 defadvice 来告诉 y-or-no-p 和 yes-or-no-p 将 use-dialog-box 设置为 nil,但同样,这对 flymake 没有帮助,因为它没有使用这些功能。