【问题标题】:Killing Racket Infinite Loops in Geiser在 Geiser 中杀死球拍无限循环
【发布时间】:2023-04-06 16:01:01
【问题描述】:

当我通过使用 geiser + 球拍评估 emacs 中的表单意外地造成无限循环时,经过一分钟左右的等待,最终 emacs 将再次开始响应。不幸的是,之后的每次评估至少需要一分钟。通常,在第二次或第三次 eval 之后,emacs 将完全停止响应,此时最快的事情就是重新启动 Ubuntu 机器。

是否有一些设置可以防止在 geiser 中发生这种情况,或者有办法告诉 emacs 杀死 geiser?

【问题讨论】:

    标签: emacs racket geiser


    【解决方案1】:

    当有事情挂断时,我会这样做。 多年来,我不记得 Emacs 陷入无法恢复的状态。

    使用 C-g。如果需要,重复。它调用keyboard-quit。 这应该会打破任何死循环,让您能够输入命令。

    现在,如果 geiser 或任何其他进程行为不端,只需终止缓冲区 对应于这个过程。 C-x C-b 将为您提供所有缓冲区的列表。 如果不认识属于geiser的那只重启Emacs 并只打开 geiser 并再次查看缓冲区列表。

    现在用 d 标记行为不端的缓冲区。 使用 x 执行删除。而已。你可以 现在重新启动 geiser 或其他任何东西。这种方法是完全通用的。

    顺便说一句,重启 Ubuntu 机器太剧烈了。 当没有任何方法可以通过窗口停止应用程序,但 X 仍然有效时, 使用xkill 实用程序。例如,我已将其绑定到 Ctrl-Alt-F12。 然后你只需点击一个你不喜欢的窗口,它就消失了。

    如果xkill 不起作用,请切换到虚拟终端 Ctrl-Alt-F1 并使用 htop 杀死应用程序。

    【讨论】:

    • 哇,我知道 C-g,只是出于某种原因我认为它不会起作用,因为 emacs 似乎不接受来自键盘的输入。太棒了,谢谢!
    【解决方案2】:

    根据REPL 文档,您应该可以使用 C-c C-q 来杀死 REPL。从 REPL 文档的链接,转到 First Aids 部分;它在它的底部附近。

    【讨论】:

    • 这样运行 geiser-repl-exit,我无法在 emacs 被旋转光标卡住时输入。
    【解决方案3】:

    Geiser 也在这里挂起循环。在两天前更新的 Debian 7 上运行的 emacs 24.3.1 中; M-x 运行-geiser;然后得到一个带有 REPL 提示的窗口。一切都很好,但是然后说 > (define f (* f (- n 1))),然后 > (f 3) 并且缓冲区中的进程被锁定。 C-c C-c 和 C-c C-q 什么都不做。杀死缓冲区,对杀死子进程的查询回答“是”,然后重新启动确实会得到一个 REPL 提示,所有定义都消失了。

    【讨论】:

    • dracket IDE 也挂起。 >德拉克特&; drracket> (define f (open-input-file "/dev/zero")); drracket> (read-line f) 并关闭到 lala 土地它去,它忽略了 IDE 上的停止按钮,控制 C 并在片刻之后停止重新绘制它的窗口。从终端它忽略 SIGHUP,或者非常非常慢。 Kill -9 导致窗口蒸发,进程消失。这可能是基本问题而不是 emacs ...
    • 天哪,更坏的消息,在线程中启动读取会导致线程挂起,但 (custodian-shutdown-all current-custodian) 不会杀死线程。
    • racketlang 的 mflatt 刚刚为此实施了一个潜在的修复程序。请参阅错误 #14800。
    猜你喜欢
    • 1970-01-01
    • 2011-03-30
    • 2021-01-05
    • 1970-01-01
    • 2013-08-04
    • 2016-10-26
    • 2014-01-14
    • 2014-05-07
    • 1970-01-01
    相关资源
    最近更新 更多