7

我在 C# flymake 模块中的 emacs elisp 中获得了 CPU 旋转。(Flymake 是 emacs 中定期运行构建的模块,然后突出显示当前缓冲区中的任何语法错误或警告。)

我将涉足代码,寻找可能发生旋转的地方。

当我在做的时候,有人对弄清楚旋转有什么建议吗?emacs 中有什么东西可以让我停止执行并查看它停止的位置吗?

4

4 回答 4

9

用于M-x set-variable设置debug-on-quitt。然后当问题发生时,点击C-g,调试器会给你一个你停止它时正在运行的回溯。

于 2010-11-15T04:52:18.767 回答
5

Flymake 为每个启用了 flymake-mode 的缓冲区设置一个 1 秒的计时器,以检查缓冲区是否在flymake-no-changes-timeout几秒前被修改。

如果你在 flymake 模式下打开了很多缓冲区(几百个),那么这会消耗大量的 CPU,我有一个补丁版本的 flymake,它有一个修复这个问题的全局计时器,以及其他一些问题:https ://github.com/illusori/emacs-flymake

这对你来说可能不是同一个问题,但对我来说,在桌面模式下打开 600 个文件时它会锁定 Emacs,我很幸运每 15 分钟处理一次按键。

于 2011-08-02T23:18:28.980 回答
2

在 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 没有帮助,因为它没有使用这些功能。

于 2012-03-27T07:41:20.603 回答
0

http://www.gnu.org/s/emacs/manual/html_node/elisp/Debugging.html可能会帮助你

于 2010-11-14T19:45:57.413 回答