在某些代码中,很容易造成无限循环但不会使堆栈溢出。当使用clojure-test测试此类代码时,有没有一种方法可以中止当前正在运行的测试而不必重启swank服务器?
目前我的工作流程包括
$ lein swank
使用slime-connect
连接到swank,然后切换到测试中,使用C-c C-,
执行,测试运行直到无限循环,然后仅返回但一个CPU仍在测试上翻滚。我发现唯一的停止方法是重新启动lein swank,但这似乎是一个相对常见的问题?有没有更好的解决方案?
在某些代码中,很容易造成无限循环但不会使堆栈溢出。当使用clojure-test测试此类代码时,有没有一种方法可以中止当前正在运行的测试而不必重启swank服务器?
目前我的工作流程包括
$ lein swank
使用slime-connect
连接到swank,然后切换到测试中,使用C-c C-,
执行,测试运行直到无限循环,然后仅返回但一个CPU仍在测试上翻滚。我发现唯一的停止方法是重新启动lein swank,但这似乎是一个相对常见的问题?有没有更好的解决方案?
是的,程序员在开发中写无限循环是一个常见问题 :). 解决方法非常简单。它被称为“中断命令”,其快捷键为C-c C-b
Leiningen与此无关。这是SLIME/Swank/Clojure。当您在Emacs中评估代码时,您将在Clojure中产生一个新线程。SLIME保留对这些线程的引用,并在Emacs模型行中显示正在运行的线程数。如果您在图形环境中,可以单击模型行指示您的名称空间并查看许多选项。其中一个选项是“中断命令”
评估(while true)
和C-c C-b
,会出现一个对话框,显示一个java.lang.ThreadDeath
错误,可能只有一个选项。您可以输入0
或q
来退出该线程,关闭该错误消息缓冲区,并返回到以前的位置。
(use 'clojure.contrib.repl-utils))
和(add-break-thread!)
应该可以使您按下C-c C-c
将SIGINT传递给长时间运行的评估/进程。C-c C-c
绑定到slime-interrupt
,它的行为与您预期的相同。 - skuro如果一切都失败了.. alt-x slime-quit-lisp
并重新启动REPL。当然,首先尝试Psyllo的答案。