12

在某些类型的代码中,相对容易导致无限循环而不会破坏堆栈。当使用 clojure-test 测试这种性质的代码时,有没有办法在不重新启动 swank 服务器的情况下中止当前正在运行的测试?

目前我的工作流程涉及

$ lein swank

使用 emacs 连接到 swank slime-connect,然后切换到测试,使用 执行C-c C-,,测试运行直到无限循环,然后返回,但一个 cpu 仍在测试中运行。我发现阻止这种情况的唯一方法是重新启动 lein swank,但这似乎是一个相对常见的问题?有人有更好的解决方案吗?

4

3 回答 3

13

是的,程序员在开发中编写无限循环是一个常见的问题:)。答案很简单。它被称为“中断命令”,它是C-c C-b

莱宁根与此无关。这是 SLIME/Swank/Clojure。当您在 Emacs 中评估代码时,您会在 Clojure 中生成一个新线程。SLIME 保持对这些线程的引用,并向您显示在 Emacs 模式行中正在运行的线程数。如果您在图形环境中,您可以单击指示您的命名空间的模式行并查看许多选项。一种选择是“中断命令”

评估(while true)C-c C-b得到一个对话框,显示java.lang.ThreadDeath错误,可能只有一个选项。您可以键入0q退出该线程,终止该错误消息缓冲区并将焦点返回到先前的缓冲区。

于 2011-02-25T15:58:49.310 回答
2

根据这个旧讨论,添加(use 'clojure.contrib.repl-utils))(add-break-thread!)到 user.clj 应该使您能够按下C-c C-c将 SIGINT 传递给长期运行的评估/进程。

于 2011-02-25T11:34:08.443 回答
1

如果一切都失败了......alt-x slime-quit-lisp并重新启动REPL。当然首先尝试 Psyllo 的答案。

于 2011-02-25T19:45:19.837 回答